无法在Python中接收UDP数据包

时间:2014-10-17 14:49:32

标签: python sockets networking udp fpga

我在python程序中接收从FPGA发送的UDP数据包时遇到问题。我检查了类似的问题并做了以下事情:

  • 检查Wireshark是否可以看到UDP数据包
  • 在PC中禁用了Windows防火墙
  • 使用sock.bind(),因为它是UDP数据包
  • 由于FPGA不支持ARP
  • ,因此在以太网帧上手动设置目标MAC地址
  • 将目的地IP设置为广播10.10.255.255进行测试,未收到数据包
  • 将数据包的UDP校验和设置为0x0000

这里是python接收器代码:

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网络中的另一台PC)接收器脚本工作正常。我甚至试图从我知道收到的数据包中逐字节地重新创建UDP pcket(差异是源IP,端口和MAC,校验和(禁用),识别)。

这里是来自Wireshark的两个数据包的输出:

Wireshark UDP packet(左边收到的Python UDP数据包,右边的python没有收到Xilinx FPGA数据包)

我不确定还有什么可以尝试的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

显然,FPGA计算的IPv4头校验和错误。由于TTL(生存时间)在路由器跃点上发生变化,因此可能会让人感到困惑,新的TTL也会更改IPv4标头,每跳一个新的校验和,直到它到达接收端的Wireshark。默认情况下,Wireshark禁用了IPv4校验和验证(可以在问题屏幕截图中看到),通过验证可以更容易地找到答案。

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

我还测试了从FPGA到主机PC的直接连接(没有路由器)。 IPv4标头也会被正确重新计算(我不确定PC的网卡在哪里?)

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