0

私は Python を使用して UDP パケットを FPGA ボードに送信していますが、Python は初めてです。Wireshark を使用して送信されるパケットを監視していますが、FPGA がすべてのパケットを正しく受信していることはわかっています。問題は、どのパケットが送信されているかです。コンピュータは接続時に FPGA が何であるかを認識しないため、識別されていないネットワークとして残し、IP アドレス (169.254.233.200) を割り当てます。このコードを使用して、単に「テスト」と言うUDPパケットをFPGAに送信しようとしています(ひどいフォーマットで申し訳ありません)。

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 アドレスが苦手です。

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 アドレスをコンピュータに伝えるために書き込みます。さらに良い方法は、適切な ARP 応答で応答するように FPGA ボードに学習させることです。

アドレス 169.254.255.255 は「ブロードキャスト アドレス」であり、一度にすべてのコンピュータに送信されます (したがって、ARP は必要ありません)。これはテストに使用しても問題ありませんが、大規模なネットワークに配置して大量のトラフィックを送信する場合、このトラフィックはネットワーク上のすべてのコンピューターで受信されます (つまり、配置すると ipad のバッテリーが早く消耗します)。それはホームネットワーク上にあります)

于 2013-09-06T15:28:46.367 に答える