同じソケットを介したUDPブロードキャストとユニキャスト?
質問
UDPソケットを開いてポートにバインドするLinuxアプリケーションがあります。ソケット経由でユニキャストパケットを送信しても問題はありません。ブロードキャストパケットを送信する機会があったので、SO_BROADCASTを有効にして、ブロードキャストパケットが通過できるようにしましたが、ユニキャストパケットもブロードキャストされていることに気付きました。これはUDPソケットの予想される動作ですか、それとも何か間違った設定をした可能性が高いですか?
解決
私が理解していることから SO_BROADCAST はソケットオプションです。したがって、ソケットで有効にすると、このソケットはブロードキャストします。同じコードからユニキャストとブロードキャストを行う場合は、異なるソケットを開く必要があると思います。
他のヒント
ここでのプログラミングはあまり行っていませんが、おそらくライブラリ、OSバージョン、コードなどに関する詳細情報を提供する必要があります。おそらくコードサンプルですか?
読んだ本を覚えている場合、ソケットにフラグを設定すると、ソケットから送信されるすべてのデータグラムに影響を及ぼします。ソケットは基本的にネットワークフラグ+ファイル記述子のデータ構造であるためです。
ソケットでユニキャストとブロードキャストを同時に取得することについて、Linuxで同じ問題を見つけました。次のように問題を解決しました(擬似コード):
-
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
- ソケットを開く
-
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
- このソケットからの着信および発信ブロードキャストを許可します
-
bind(sock, bindaddr, sizeof(struct sockaddr)
with
bindaddr.sin_family = AF_INET
bindaddr.sin_port = <YourPort>
bindaddr.sin_addr.s_addr = INADDR_ANY
-
<YourPort>
のカード上のすべての受信メッセージを取得する
警告は、フィルタリングがないことです(3の警告を参照)。したがって、すべてのメッセージを取得します。
送信されたメッセージは、sendto()
内の指定されたアドレスでユニキャストまたはブロードキャストされます。