- ネットワークプログラミング相談室 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);
|