我正在用python开发一个反向shell应用程序,现在我正试图实现一个自动发现特性。其工作原理如下:
广播工作正常,客户端接收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地址的发现。 有什么线索可以说明问题吗?在
在服务器代码中将
sckt.settimeout(None)
更改为sock.settimout(None)
。在您希望接受套接字处于阻塞模式,而不是接受套接字。在
这确保
sckt.recv
等待来自客户端的传入消息。在p.S。
sock.setblocking(1)
完全相同相关问题 更多 >
编程相关推荐