2017-09-29 10 views
1

これはmacOSに関する質問です。私は、SSDPメッセージ、すなわちUDPパケットを受信して​​マルチキャストアドレスに送信するUDPソケットをセットアップしようとしています。これらのパケットを単一のネットワークインターフェイスから受信することを制限したいと思います。macOS上の単一のネットワークインターフェイスからマルチキャストUDPパケットを受信する

私はのsetsockoptコールがerrno 42(プロトコルは使用できません)で失敗し

int fd = socket(AF_INET, SOCK_DGRAM, 0); 
char* itf = "en0"; 
int res = setsockopt(fd, SOL_SOCKET, IP_RECVIF, itf, strlen(itf)); 

を試してみました。 同じ目的で使用できるSO_BINDTODEVICEも見つかりましたが、これはmacOSでは利用できないようです。

ポートとアドレスのバインドを使用しても機能しません。マルチキャストアドレスに送信されたパケットは、そのソケットで受信されません。

答えて

0

OSX documentation on IP multicast ...

から、それがグループに送信されたデータグラムを受信する前に、ホストがマルチキャストグループのメンバーになる必要があります。マルチキャストグループに参加するには、IP_ADD_MEMBERSHIPオプションを使用してください。

特定のインターフェイスでマルチキャストトラフィックを受信するには、そのマルチキャストグループに参加することをOSに通知する必要があります。これらの手順に従ってください(ほとんどの場合)...

  1. データグラムソケットを作成します(完了しました)。
  2. 予想ポートでINADDR_ANYにバインドします。
  3. IP_ADD_MEMBERSHIPオプションを使用してマルチキャストグループに参加します。ここでは、マルチキャストトラフィックを受信する特定のネットワークインターフェイスのIPアドレスをip_mreq構造体に渡すことができます。
+0

多くのおかげで、問題を解決しました。私は実際にSwiftからGCDAsyncUdpSocketを使用しています。 'joinMulticastGroup()'メソッドはインターフェイスを第2のパラメータとして受け取ります。実装は、 'IP_ADD_MEMBERSHIP'で' setsockopt() 'を使うよりも実装が簡単です。誰かがあなたの答えに投票した理由は分かりません。 – Bokeh

関連する問題