【问题标题】:Python UDP Communication over unidentified networkPython UDP 通过身份不明的网络进行通信
【发布时间】:2013-06-24 18:26:47
【问题描述】:

我正在使用 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 尽可能简单,所以我希望它不必向计算机发送任何数据包来验证连接。这就是我想使用 UDP over TCP 的原因。

任何帮助将不胜感激。

格雷姆

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

课程:我不擅长 IP 地址。

【问题讨论】:

  • FPGA 是否实现了 IP 堆栈?你的FPGA的ip是多少?它是如何连接到您的计算机的?
  • 该板通过以太网连接。我对 IP 堆栈不熟悉,但板上有一个预编程的微处理器,可以处理计算机和 FPGA 之间的连接。但是,我不相信它会自行将任何内容发送回计算机,并且在我的逻辑中我不会将任何内容发送回计算机。我也希望保持这种方式以减少使用的逻辑元素的数量。
  • "板上有一个预编程的微处理器,用于处理计算机和 FPGA 之间的连接" 应该如何建立连接?通过串口、以太网、USB ?你得到一个默认 ip,因为板子没有 DHCP 服务器,因此为什么发送到 169.254.233.201 不起作用。

标签: python networking network-programming udp fpga


【解决方案1】:

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

以太网帧不能直接发送到 IP 地址,只能发送到 MAC 地址。因此,发送者计算机必须以某种方式学习 IPMAC 地址映射。通常,“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)。这可以用于测试,但是如果您将其放入大型网络并发送大量流量,那么网络上的每台计算机都会接收到此流量(即,如果您放它在家庭网络上)

【讨论】:

    猜你喜欢
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2016-05-28
    • 2012-01-12
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多