トップページ > プログラム > 2014年10月19日 > y7reFn4b

書き込み順位&時間帯一覧

37 位/176 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000001000000000001002



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
ネットワークプログラミング相談室 Port29

書き込みレス一覧

ネットワークプログラミング相談室 Port29
930 :デフォルトの名無しさん[sage]:2014/10/19(日) 09:09:45.23 ID:y7reFn4b
LinuxでのSocketプログラミングについて教えてください。

・やりたいこと
IPエイリアスで複数アサインしたIPアドレス毎にU)ユニキャストとM)マルチキャストを送受信したい。
・試したこと
1) bind時にIPアドレスを指定(NO-2)
→M)マルチキャストが受信できない
2) UDPの場合はSO_REUSEADDRで同じポートを指定しても良い(NO-4)そうなので指定。
→M)マルチキャストが受信でき、希望通りの動作になった
★U)ユニキャストはNO-3で指定したインターフェースしか受信出来ないのは正しい動作か?

コードの概要は以下の通りです。
#define ETH0_IP "192.168.0.1"
#define ECH00_IP "192.168.0.2"

sock = socket(AF_INET, SOCK_DGRAM, 0);
#ifdef ANY_ADDR
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof opt); // NO-4
#endif
addr.sin_family = AF_INET;
addr.sin_port = htons(3610);
#ifdef ANY_ADDR
addr.sin_addr.s_addr = INADDR_ANY; // NO-1
#else
addr.sin_addr.s_addr = inet_addr(ETH0_IP); // NO-2: eth0
#endif
bind(sock, (struct sockaddr *)&addr, sizeof addr);
mreq.imr_interface.s_addr = inet_addr(ETH0_IP); // NO-3
mreq.imr_multiaddr.s_addr = inet_addr("224.0.23.0");
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof mreq);

recvfrom(sock, buf, sizeof buf, 0, (struct sockaddr *)&from, &addr_len);
ネットワークプログラミング相談室 Port29
932 :デフォルトの名無しさん[sage]:2014/10/19(日) 21:12:24.57 ID:y7reFn4b
>>930
> 2) UDPの場合はSO_REUSEADDRで同じポートを指定しても良い(NO-4)そうなので指定。
> →M)マルチキャストが受信でき、希望通りの動作になった
> ★U)ユニキャストはNO-3で指定したインターフェースしか受信出来ないのは正しい動作か?
今日試したらNGでした(昨日は何度も確かめたのですが)、、、

ANY_ADDRでない場合、マルチキャストを受信できるようにするにはどうしたらよいのでしょうか?

そもそも「addr.sin_addr.s_addr」には、受信(送信)したいIFのIP{アドレスを指定するのですよね?
以下のように指定してもマルチキャストが受信できるのは正しい動作なのでしょうか?

addr.sin_addr.s_addr = inet_addr("224.0.23.0");


ちなみにubuntu14.04 32bit版で試しています。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。