无法接收UDP数据包在Python(Can't receive UDP packet in

2019-10-21 03:42发布

我无法接收在Python程序从FPGA发送的UDP包。 我检查了类似的问题,也做了以下内容:

  • 经过Wireshark才能看到的UDP数据包
  • 禁用Windows防火墙在PC
  • 二手sock.bind(),因为它的UDP数据包
  • 手动设置的以太网帧,因为FPGA不支持ARP目的MAC地址
  • 设置目的IP广播10.10.255.255进行测试,没有收到的数据包
  • 从发送方为0x0000设置数据包的UDP校验

这里的蟒蛇接收器的代码:

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(从另一台电脑的网络10.10.10中)另一个python脚本测试接收器脚本工作正常。 我甚至一直在努力,重建UDP pcket逐字节从我知道接收OK包在FPGA(差异是源IP,端口和MAC校验和(禁用),识别)。

下面是输出从Wireshark的两个包:

Wireshark的UDP数据包 (也被接收到的OK左侧Python的UDP包,Xilinx的FPGA数据包不会被蟒蛇右侧收到)

我不知道什么尝试。 任何帮助,将不胜感激。

Answer 1:

显然,从FPGA计算IPv4报头校验和是错误的。 它可能会比较混乱,因为TTL(生存时间)上的路由器跳变为跟随,而新的TTL也将改变IPv4报头,迫使每跳一个新的校验,直到它到达的Wireshark在接收端。 默认情况下,Wireshark的已禁用的IPv4校验和验证(如可在这个问题的截图中可以看出),答案是更容易与验证发现。

我包施工为零(X0000)期间设置的IPv4的校验和。 它能够在路由器重新计算正确,并用正确的校验和Python可以接收数据包。

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

希望这是有人用类似的问题非常有用。



文章来源: Can't receive UDP packet in Python