在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数据包)不知道还有什么要尝试。任何帮助,将不胜感激。

+0

*旁白*:将'UDP_IP'设置为您的本地地址过于具体。相反,请执行'UDP_IP ='''绑定到所有接口。这不会解决今天的问题,但可能会在未来防止出现问题。 – 2014-10-17 16:14:33

显然,FPGA计算中的IPv4头校验和是错误的。由于TTL(生存时间)在路由器跳变时发生变化,因此可能会产生混淆,新的TTL也会更改IPv4报头,从而每跳都会产生一个新的校验和,直到它到达接收端的Wireshark。默认情况下,Wireshark的IPv4校验和验证被禁用(在问题截图中可以看到),答案更容易在验证时发现。

我在数据包构造过程中将IPv4校验和设置为零(x0000)。它会在路由器处正确重新计算,并且使用正确的校验和Python可以接收数据包。

我还测试了从FPGA到主机PC的直接连接(无路由器)。 IPv4头也得到了正确的重新计算(我不知道在哪里,可能是PC的NIC?)

希望这对有类似问题的人有用。