linux C言語 bind で指定するIPアドレス

2020-06-21 Sun. 04:42:21 JST
linux プログラミング
by kiyozzy

■ bind

bindのよくある例

addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = INADDR_ANY;

bind(sock, (struct sockaddr *)&addr, sizeof(addr));

INADDR_ANYを指定しているが、bindの説明を見てもよく分からない。

■ bind のIPアドレスを指定するときは受信先アドレスを指定する

自分のIPが例えば192.168.0.5とかだったりした場合、
普通に考えて受信口の設定なのだから 192.168.0.5 を指定してみると、 ユニキャスト送信からの受信では受信成功。
ネットワークインターフェイスが2つあって、もうひとつが 192.168.1.9 とかだった場合、 192.168.0.5 を指定しているので、 192.168.1.9 に送信しても受信しない。
ここまでは予想通り。
では、ブロードキャストではどうかと言うと、 192.168.0.5 を指定しても受信しない。
255.255.255.255 を指定し、送信側が 255.255.255.255 で送信すると受信し、
送信側が 192.168.0.5 や 192.168.0.255 に送っても受信しない。
ブロードキャストが 192.168.0.255 の場合もしかりで、 192.168.0.255 宛てしか受信しない。
そして、マルチキャストの場合でも同じで、 192.168.0.5 を指定してもマルチキャストは受信せず、 マルチキャストのアドレスをbindで指定すると受信する。

INADDR_ANYは、どのIPアドレス受信口でも受けますよ、っていう動作。

以上、UDPで動作確認。ルータ越しにポートマッピングとかの場合は、また時間があったときに調査。