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

标签 python sockets networking broadcast

我正在用 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 个字节的数据。我有一个算法,它为消息加上长度前缀,接收方逐字节读取这个前缀,直到一个分隔符,这就是原因。 客户端测试代码:

broadcastSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
broadcastSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
broadcastSocket.settimeout(3)
broadcastSocket.bind(('', 8888))
while True:
    try:
        data = broadcastSocket.recv(1024)
        break
    except socket.timeout:
        pass
broadcastSocket.close()

sckt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sckt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sckt.connect((str(data.split()[0]), int(data.split()[1])))

print sckt.recv(1024)
sckt.send('lel')

如果我省略代码的整个广播和自动发现部分并简单地手动输入服务器的 IP/端口 print sock.recv(1) 不会失败。 关于问题可能是什么的任何线索?

最佳答案

在服务器代码中将 sckt.settimeout(None) 更改为 sock.settimout(None)

您希望接受套接字处于阻塞模式,而不是接受套接字。

这确保 sckt.recv 等待来自客户端的传入消息。

附言 sock.setblocking(1)完全一样

关于python - python中的UDP广播和自动服务器发现,TCP套接字不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34826133/

相关文章:

python - 用类方法修饰类方法

Python pandas,如何只绘制一个实际有数据点的 DataFrame 并留下间隙

c# - 用于电子邮件发送的波兰字符 MIME 格式的问题

java - 套接字流读取何时返回?

Java:在wi-fi路由器后面的设备中发送/接收Udp数据包

python - 过程在导入时的执行方式与在其 native 模块中运行时的执行方式不同

python - 卡尔曼滤波器如何在 Opencv python 中跟踪多个对象?

java - UDP 数据包内容在传输时发生变化

networking - 网络中的IP地址和端口号有什么区别?

android - 从 Android 在 wifi 网络上查找我的笔记本电脑的 IP