【发布时间】:2021-08-07 04:05:48
【问题描述】:
通过调用bind() 并接收recvfrom() 的消息,我可以在Ubuntu 20.04 中成功接收数据包。但是,切换到 Windows 似乎打破了这一点。清除防火墙问题后,我可以在 Python 3.9 中成功接收数据包,但我仍然无法在 Python 2.7 中接收它(这是我当前程序正在使用的)。在 Python 2.7 中运行时,它似乎挂断了 recv() / recvfrom() 调用,直到我终止它。 2.7 和 3.9 在 Ubuntu 中运行良好,所以我似乎只在 Windows 上使用 Python 2.7 遇到这个问题。
更新:我认为 IP 地址和端口并不重要,因为代码在使用 Python 3 的 Ubuntu 和 Windows 上运行良好。我无法访问代码,但希望稍后更新。我所知道的是,该板正在向我绑定到下面的特定端口和 IP 地址广播。
recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recv_socket.bind(("192.168.11.149", 5155))
data = recv_socket.recv(1024)
print(data)
我有意连接到特定 IP,而不是接受所有 IP 地址。该 IP 也是我的 Ubuntu 和 Windows 操作系统(在同一台机器上)的 ifconfig/ipconfig 中显示的正确 IP,因为我通过该特定端口硬连线到我们的主板。
我缺少 Windows 和 Ubuntu 之间的行为变化吗?或者 Python 2.7 和 Python 3.9 之间的更改会导致 recv() 调用像这样冻结?
【问题讨论】:
-
你绑定的是哪个IP地址?您要向哪个 IP 地址广播?
-
换句话说,创建一个minimal reproducible example。
-
@user207421 当我绑定到 IP/端口时,消息被广播到相同。我已更新代码以显示 IP 和端口。
-
向 192.168.11.149 发送 UDP 数据报不是广播。它是单播的。除非您知道自己在做什么,否则您通常应该绑定到 0.0.0.0。除非您的 Windows 和 Linux 共同驻留在同一主机中,否则其 IP 地址必须不同。
-
@user207421 这很公平;我将编辑以更正措辞。对于这种情况,0.0.0.0 将完成同样的事情,虽然我并不十分担心安全风险,但我也看不出它会如何影响任何事情。它在 Linux 上运行相同,并没有解决 Windows 上的问题。 Windows 和 Linux 在同一台机器上运行,并且 if/ipconfig 都显示 192.168.11.149(至少在我连接的以太网端口上)。
标签: python-3.x python-2.7 sockets networking