在Python中无法接收UDP数据包
问题描述:
我在接收从python程序中的FPGA发送的UDP数据包时遇到问题。我检查了类似的问题,也做了以下内容:在Python中无法接收UDP数据包
- 经过,Wireshark才能看到的UDP数据包
- 禁用Windows防火墙在PC
- 使用sock.bind(),因为它是UDP数据包
- 手动设置以太网帧的目的地MAC地址,因为FPGA不支持ARP
- 设置目的IP用于测试广播10.10.255.255,接收到没有数据包
- 设置该分组的UDP校验和从发送器到0x00 00
这里的蟒蛇接收器代码:
import socket
import sys
UDP_IP = "10.10.10.87"
UDP_PORT = 4660
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
print("Socket: "+str(sock.getsockname()))
while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
print(data)
print(addr)
sys.stdout.flush()
当针对发送到10.10.10.87:4660 另一个python脚本(在10.10.10网络中的另一台电脑)测试接收器脚本作品精细。我甚至尝试从我知道收到的包(不同点是源IP,端口& MAC,校验和(禁用),标识)的数据包在FPGA中逐字节地重新创建UDP数据包。
下面是输出针对这两个分组从Wireshark的:
我Wireshark UDP packet(也被接收到的OK左边,也就是不Python右侧获得赛灵思FPGA包Python的UDP数据包)不知道还有什么要尝试。任何帮助,将不胜感激。
答
显然,FPGA计算中的IPv4头校验和是错误的。由于TTL(生存时间)在路由器跳变时发生变化,因此可能会产生混淆,新的TTL也会更改IPv4报头,从而每跳都会产生一个新的校验和,直到它到达接收端的Wireshark。默认情况下,Wireshark的IPv4校验和验证被禁用(在问题截图中可以看到),答案更容易在验证时发现。
我在数据包构造过程中将IPv4校验和设置为零(x0000)。它会在路由器处正确重新计算,并且使用正确的校验和Python可以接收数据包。
我还测试了从FPGA到主机PC的直接连接(无路由器)。 IPv4头也得到了正确的重新计算(我不知道在哪里,可能是PC的NIC?)
希望这对有类似问题的人有用。
*旁白*:将'UDP_IP'设置为您的本地地址过于具体。相反,请执行'UDP_IP ='''绑定到所有接口。这不会解决今天的问题,但可能会在未来防止出现问题。 – 2014-10-17 16:14:33