我知道有几个问题已经讨论了recvfrom
函数悬挂的问题,但是,我无法找到导致我找到解决方案的问题/回复。
在我的设置中,我有一台运行ubuntu 16.04 VM的Windows 10计算机(使用VmWare Workstation 12作为托管程序)。
Windows IP:192.168.0.100
Ubuntu IP:192.168.0.102
我设置的hacky部分是我从主机向我的VM发送udp数据包的方式。我有几个.pcap
个捕获的UDP数据包文件,我用一个名为PlayCap的程序注入网络。通过这种设置,我可以验证重播的数据包是否确实通过wireshark正确地注入我的VM网络。
对于我的测试,我一直在使用两个不同的.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
函数。
有谁知道我做错了什么或者可以提供任何有关为什么会发生这种情况的信息?我查看了socket API以及涉及recvfrom
和socket
的所有其他问题。
在深入挖掘并比较两个数据包的标头后,我发现源/目标mac地址存在差异。这是有道理的,因为带有传感器数据的.pcap
是在另一台人员计算机上捕获的,并且xml数据是在我的机器上捕获的。所以我认为我的程序没有拿起传感器数据,因为传感器数据被发送到正确的IP而不是正确的Mac地址。我通过将传感器板直接插入网络来验证这一点。包含传感器数据的UDP数据包立即被我的程序选中。