0

我正在使用 Python 将 UDP 数据包发送到 FPGA 板,并且对 python 相当陌生。我正在使用 Wireshark 监控正在发送的数据包,并且我知道 FPGA 正在正确接收所有数据包。问题在于发送的数据包。计算机在连接​​时无法识别 FPGA 是什么,因此它将其作为一个未识别的网络并为其分配一个 IP 地址 (169.254.233.200)。我正在使用此代码尝试向 FPGA 发送一个简单地说“测试”的 UDP 数据包(抱歉,格式很糟糕)。

import sys

import socket

def main():

    UDP_IP="169.254.233.201"
    UDP_PORT=9
    MESSAGE='Test'

    print ("UDP target IP:", UDP_IP)
    print ("UDP target port:", UDP_PORT)
    print ("message:", MESSAGE)
    sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM ) # UDP
    sock.sendto( bytes(MESSAGE, 'UTF-8'), (bytes(UDP_IP, 'UTF-8'), UDP_PORT) )

但是,在运行此脚本时,计算机不会发送 UDP 数据包,而是会广播一条消息:“谁拥有 169.254.233.201?告诉 169.254.233.200”。我猜这是由身份不明的网络引起的问题,或者我只是错误地处理了数据包。我试图让 FPGA 上的 HDL 尽可能简单,所以我希望它不必向计算机发送任何数据包来验证连接。这就是我想在 TCP 上使用 UDP 的原因。

任何帮助,将不胜感激。

格雷姆

已解决:我注意到计算机在尝试建立连接时正在向端口 169.254.255.255 发送消息。我将 UDP_IP="169.254.233.201" 更改为 UDP_IP="169.254.255.255" 并且 UDP 数据包开始通过。

教训:我不擅长 IP 地址。

4

1 回答 1

0

对于参考/未来的读者,问题是您的 FPGA 缺乏 ARP 协议支持。

以太网帧不能直接发送到 IP 地址,只能发送到 MAC 地址。因此,发送者计算机必须以某种方式学习 IP<->MAC 地址映射。通常,“ARP”协议会这样做——消息"Who has 169.254.233.201? Tell 169.254.233.200".是 ARP 请求。正确的解决方法是手动添加 ARP 条目,例如在 Linux 上,可以写入arp -s 169.254.233.201 00:00:11:22:33:44告诉计算机 FPGA 板的 MAC 地址。更好的方法是教 FPGA 板以正确的 ARP 回复进行响应。

地址 169.254.255.255 是一个“广播地址”,它会同时到达所有计算机(因此不需要 ARP)。这可以用于测试,但是如果您将其放入大型网络并发送大量流量,那么网络上的每台计算机都将接收到此流量(即,如果您放它在家庭网络上)

于 2013-09-06T15:28:46.367 回答