我在python程序中接收从FPGA发送的UDP数据包时遇到问题。我检查了类似的问题并做了以下事情:
这里是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数据包)
我不确定还有什么可以尝试的。任何帮助将不胜感激。
答案 0 :(得分:1)
显然,FPGA计算的IPv4头校验和错误。由于TTL(生存时间)在路由器跃点上发生变化,因此可能会让人感到困惑,新的TTL也会更改IPv4标头,每跳一个新的校验和,直到它到达接收端的Wireshark。默认情况下,Wireshark禁用了IPv4校验和验证(可以在问题屏幕截图中看到),通过验证可以更容易地找到答案。
我将数据包构建期间的IPv4校验和设置为零(x0000)。它会在路由器上正确重新计算,并且使用正确的校验和,Python可以接收数据包。
我还测试了从FPGA到主机PC的直接连接(没有路由器)。 IPv4标头也会被正确重新计算(我不确定PC的网卡在哪里?)
希望这对有类似问题的人有用。