
私が理解したように、ソケットがローカルアドレスにバインドされていない(またはバインドされているINADDR_ANY
)場合、リモートアドレス/ポート設定を呼び出さないconnect()
- インターフェイスが1つのコンピュータでは、デフォルトのIPアドレスはIP_ADDRです。
- ソケットAはUDPマルチキャストアドレスMULTICAST_IP_Aを受信し、ポート番号はPORT_Aです。
- ソケットBはPORT_BからUDPユニキャストを受信します。
それでは、次の文は正しいですか?
- グループアドレスMULTICAST_IP_A(ポート番号PORT_B)に送信されたマルチキャストパケットはソケットBに転送されます。
- IP_ADDR:PORT_Aに送信されたユニキャストパケットはソケットAに転送されます。
LinuxのIPv4ソースコードを見てみると、これまでに上記の2つのシナリオが発生しているようです。たとえば、次のようになります。__udp_is_mcast_sock()
true
空でも返されますinet->mc_list
。inet_create()
inet->mc_all
しかし、私は専門家で1
はなく、誰かがこれらの主張を確認/無効化し、いくつかのコードポインタを提供することを聞きたいと思います。ありがとうございます!
答え1
ローカルアドレスがマルチキャストでない場合、udp_is_mcast_sock()はfalseを返します(参照)。ip_mc_sf_allow)。
両方の質問についてこの記事が役に立つかもしれません。マルチキャスト(UDP)ソケットをバインドすることはどういう意味ですか?
ケース1の場合。
- マルチキャストパケットはグループアドレスMULTICAST_IP_Aに送信され、ポート番号はPORT_Bです。〜しないだろうソケットBに送信
ケース2の場合。
- IP_ADDR:PORT_Aに送信されたユニキャストパケット〜するソケットAに渡されます。 UDPマルチキャストソケットは0.0.0.0にバインドされています。これがまさにその理由です。
netstat -aun
すでにポート5353(avahi / mdns)にサーバーがある可能性がありますが、サーバーを起動して確認できます。
Pythonマルチキャストクライアント/サーバープログラムを使用して、このケースとは異なるケースを確認できます。この投稿。ユニキャストクライアント/サーバーの動作をシミュレートするには、nc
(netcat)を使用できます。