私は、ノードAからUDPブロードキャストパケットを無効にして、ノードA自身がrcvdにすることができないことを知りたいと思います。私は単純にINADDR_BROADCASTを使用しており、 rcvr側では、私はAI_PASSIVE |を使用しています。 AI_NUMERICHOST。UDPブロードキャストの自己受信を無効にする
おかげ Arpit
私は、ノードAからUDPブロードキャストパケットを無効にして、ノードA自身がrcvdにすることができないことを知りたいと思います。私は単純にINADDR_BROADCASTを使用しており、 rcvr側では、私はAI_PASSIVE |を使用しています。 AI_NUMERICHOST。UDPブロードキャストの自己受信を無効にする
おかげ Arpit
いいえ、これは放送の基本的な性質である - 送信者を含むサブネット上のすべてのホストは、すべての道ネットワークスタックまでパケットを処理する必要があります。次のオプションがあります。
IP_MULTICAST_LOOP
ソケットオプションを使用してマルチキャストループバックを明示的に制御できるため、これが好まれます。bind(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,...) ...
このようにして、指定されたインターフェイスに到着しなかったデータは受信されません。
ここに私のPythonのソケットライブラリを使った実験の結果があります。 UDPブロードキャスタがそれ自体で送信されるメッセージを受信するかどうかは、ブロードキャストソケットをどのアドレスにバインドするかによって異なります。明快にするために、ブロードキャスタのIPアドレスは192.168.2.1でした。
受信者はこれらのすべてのケースでブロードキャストされたUDPメッセージを受信しました。
P.S. Linuxカーネル4.4.38
Python 2.7.9、OS Raspbian 8でテストされた別のオプションは、各着信パケットのsrc IPを調べ、ローカルIPからのパケットを無視することです(s)。 –
はい、マルチキャストでは、これはハードウェア/カーネルレベルで行われます。 –
それぞれのアプリケーションがブロードキャストを行い、固定番号のポートにブロードキャストする他の人にリスニングするためです。それはできません。 – Arpit