INADDR_ANYマクロを使用せずに、UDP / マルチキャスト ソケットを特定のインターフェイスにバインドするように、マルチキャスト リスナー / 送信者の例を変更しようとしています。
インターフェイスの IPv4 アドレスを所有しています。以下を試してみましたが、ソケットが UDP (ユニキャスト、ブロードキャスト、マルチキャスト) パケットを受信しません。
struct sockaddr_in addr;
int fd, nbytes;
socklen_t addrlen;
struct ip_mreq mreq;
// my_ipv4Addr equals current IP as String, e.g. "89.89.89.89"
// create what looks like an ordinary UDP socket */
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("socket");
exit(1);
}
// set up addresses
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
// [-] addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_addr.s_addr = inet_addr(my_ipv4Addr);
addr.sin_port = htons(port);
// bind socket
if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
perror("bind");
exit(1);
}
// use setsockopt() to request that the kernel join a multicast group
mreq.imr_multiaddr.s_addr = inet_addr(group);
// [-] mreq.imr_interface.s_addr = htonl(INADDR_ANY);
mreq.imr_interface.s_addr = inet_addr(my_ipv4Addr);
if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))< 0) {
perror("setsockopt");
exit(1);
}
編集:
私のプログラムの目的を説明しましょう。ネットワークがブロードキャスト/マルチキャストをサポートしているかどうかをチェックする小さなツールを書いています。したがって、私は 2 つのインターフェイスを持つシステムを所有しており、Interface1 経由でマルチキャスト パケットを送信し、Interface2 で受信しようとしています。ただし: パケットは、ループパック デバイスではなく、ネットワークを通過する必要があります。
アイデアは、thread1/interface1 でマルチキャスト ループバックを次のようにブロックすることです。
u_char loop = 0;
setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
そして、thread2/interface 2 インターフェイス固有でリッスンします。Tcpdump は、パケットが到着していることを示していますが、上記の構成ではドロップされています。