2010-12-21 21 views
2

私は、ノードAからUDPブロードキャストパケットを無効にして、ノードA自身がrcvdにすることができないことを知りたいと思います。私は単純にINADDR_BROADCASTを使用しており、 rcvr側では、私はAI_PASSIVE |を使用しています。 AI_NUMERICHOST。UDPブロードキャストの自己受信を無効にする

おかげ Arpit

答えて

2

いいえ、これは放送の基本的な性質である - 送信者を含むサブネット上のすべてのホストは、すべての道ネットワークスタックまでパケットを処理する必要があります。次のオプションがあります。

  • multicastに切り替えます。これはマルチキャストがブロードキャストに比べてネットワーク全体の負荷を軽減し、IP_MULTICAST_LOOPソケットオプションを使用してマルチキャストループバックを明示的に制御できるため、これが好まれます。
  • 送信マシンの宛先ポートをbind(2)にしないでください。これは動作しますが、アプリケーションの設計や展開に制限があるため、クルージングのようなものです。
+0

Python 2.7.9、OS Raspbian 8でテストされた別のオプションは、各着信パケットのsrc IPを調べ、ローカルIPからのパケットを無視することです(s)。 –

+0

はい、マルチキャストでは、これはハードウェア/カーネルレベルで行われます。 –

+0

それぞれのアプリケーションがブロードキャストを行い、固定番号のポートにブロードキャストする他の人にリスニングするためです。それはできません。 – Arpit

2

アドレスだけでなく、インターフェイスにバインドします。

#include <net/if.h> 
    #include <socket.h> 

    struct ifreq interface; 
    strcpy(interface.ifr_ifrn.ifrn_name, "eth0"); 

    int fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
    setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &interface, sizeof(interface)); 

    //... bind(fd,...) ... 

このようにして、指定されたインターフェイスに到着しなかったデータは受信されません。

1

ここに私のPythonのソケットライブラリを使った実験の結果があります。 UDPブロードキャスタがそれ自体で送信されるメッセージを受信するかどうかは、ブロードキャストソケットをどのアドレスにバインドするかによって異なります。明快にするために、ブロードキャスタのIPアドレスは192.168.2.1でした。

  • 'は192.168.2.255' または 'に結合する場合'(空アドレス)、放送局は、自身が送信されたメッセージを受信
  • に結合する '192.168.2.1'、 '255.255.255.255' または「<放送>放送業者はそれ自身で送信されたメッセージを受信しません。

受信者はこれらのすべてのケースでブロードキャストされたUDPメッセージを受信しました。

P.S. Linuxカーネル4.4.38