Python UDP通过身份不明的网络进行通信

时间:2013-06-24 18:26:48

标签: python networking network-programming udp fpga

我正在使用Python将UDP数据包发送到FPGA板,这对python来说还是一个新手。我正在使用wireshark监视正在发送的数据包,我知道FPGA正在正确接收所有数据包。问题在于正在发送什么数据包。计算机在连接​​时无法识别FPGA是什么,因此它将其作为未识别的网络留下并为其分配IP地址(169.254.233.200)。我正在使用此代码尝试向FPGA发送一个简单地说“Test”的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地址不好。

1 个答案:

答案 0 :(得分: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)。这可以用于测试,但是如果你把它放到大型网络并发送大量流量,那么网络上的每台计算机都会收到这种流量(如果你把它放到你的ipad上就会更快耗尽它在家庭网络上)