python中的UDP广播和自动服务器发现,TCP套接字不可用

2024-09-30 01:22:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python开发一个反向shell应用程序,现在我正试图实现一个自动发现特性。其工作原理如下:

  1. 服务器广播它监听连接的IP/端口,并等待客户端。如果没有客户机在几秒钟内尝试连接,它将再次广播(并重复直到连接)。在
  2. 客户端尝试接收服务器的广播,并连接到播发的IP/端口。在

广播工作正常,客户端接收IP/端口并成功连接,但是在使用连接的端口对后(服务器端):

socket.error: [Errno 35] Resource temporarily unavailable

服务器端测试代码:

sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sckt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sckt.settimeout(2)
sckt.bind(('', 9999))
sckt.listen(5)

broadcastSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
broadcastSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
broadcastSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
while True:
    broadcastSocket.sendto(socket.gethostbyname(socket.getfqdn()) + ' ' + str(9999), ('<broadcast>', 8888))
    try:
        sock, address = sckt.accept()
        break
    except socket.timeout:
        pass
broadcastSocket.close()
sckt.settimeout(None)

sock.send('test')
# if I add time.sleep(1) here, it works, but I don't get why
# would sock be unavailable at first, but available a second later
print sock.recv(1) # this is where it fails
# note that it also fails with any recv buffer size, for instance 1024

你可能会问,我到底为什么要接收1字节的数据。我有一个算法,它以消息的长度作为前缀,接收者逐字节读取前缀,直到有一个分隔符,这就是为什么。 客户端测试代码:

^{pr2}$

{I{I>如果自动发现的部分IP地址没有被手动输入,那么就忽略了整个IP地址的发现。 有什么线索可以说明问题吗?在


Tags: 端口ip服务器客户端so服务器端itsocket

热门问题