2020-06-21 Sun. 04:42:21 JST
linux プログラミング
by kiyozzy
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の説明を見てもよく分からない。
自分の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で動作確認。ルータ越しにポートマッピングとかの場合は、また時間があったときに調査。