我知道有几个问题已经讨论了recvfrom
函数挂起的问题,但是,我还没有找到导致我找到解决方案的问题/回复。
我的设置(有点hacky)
在我的设置中,我有一台运行 ubuntu 16.04 VM 的 Windows 10 机器(使用 VmWare Workstation 12 作为托管程序)。
视窗 IP:192.168.0.100
Ubuntu IP:192.168.0.102
我的设置中最棘手的部分是我将 udp 数据包从主机发送到我的 VM 的方式。我有几个.pcap
捕获的 UDP 数据包文件,我用一个名为PlayCap的程序将它们注入网络。通过此设置,我可以验证重放的数据包确实通过wireshark 正确注入到我的VM 网络中。
PCAP 文件信息
对于我的测试,我一直在使用两个不同的.pcap
文件,其中包含来自两个完全不同的流的 UDP 数据包,但是,源 (192.168.0.100) 和目标 (192.168.0.102) IP 地址是相同的。它们也有相同的目的端口(5000)。
这可能需要解释,也可能不需要解释,但是这些 UDP 数据包的有效载荷的格式是非常不同的。一个有一个有效负载,其字节代表一个序列化的 XML 文档。另一个有效载荷只是一个字节数组,表示数组中不同位置的传感器测量值的不同值,等等。
如果您想知道我为什么要解释这些 UDP 消息的有效负载,请继续阅读。
问题
所以我的程序面临的问题是它可以成功地从一个重放的 UDP 流接收数据包,但不能从另一个接收数据包。一种有效的是带有 XML 有效负载的流。一个不起作用并导致recvfrom
函数挂起并等待数据的是传感器数据有效负载。
import socket
UDP_IP = "192.168.0.102"
UDP_PORT = 5000
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
buffer_size = 2048
print "1"
data, address = sock.recvfrom(buffer_size)
print "2"
print "received message:", data
使用 XML 有效负载数据包输出
>>> 1
>>> a bunch of xml
>>> 2
>>> 1
>>> a bunch of xml
....
一直持续到 PlayCap 播放完.pcap
文件
>>> 1
>>>
程序挂起recvfrom
函数。
有谁知道我做错了什么或者可以提供任何关于为什么会发生这种情况的信息?我已经查看了套接字 API和所有其他涉及recvfrom
and的问题socket
。
更新
在深入挖掘并比较两个数据包的标头后,我发现源/目标mac地址存在差异。这是有道理的.pcap
,因为传感器数据是在另一个人的计算机上捕获的,而 xml 数据是在我的机器上捕获的。所以我认为我的程序没有获取传感器数据,因为传感器数据被发送到正确的 IP 但不是正确的 Mac 地址。我通过将传感器板直接插入我的网络来验证这一点。包含传感器数据的 UDP 数据包立即被我的程序拾取。