3

以下のコードを考えると、

マルチキャスト用に UDP ソケットをバインドしようとしています。
私はそれを特定のポートにバインドし、IP_ADD_MEMBERSHIPリッスンするアドレスを設定しました。

私の質問: ソケットは、そのポートにバインドされたユニキャスト UDP パケットを受信しますか? もしそうなら、どうすればそれを防ぐことができますか?マルチキャストのみ受信したい。

int fd;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
    perror("socket");
    exit(1);
}

u_int yes = 1;
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0)
{
    perror("Reusing ADDR failed");
    exit(1);
}

struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = (source_iface.empty()
                          ? htonl(INADDR_ANY)
                          : inet_addr(source_iface.c_str()));

if (bind(fd,(struct sockaddr *)&addr, sizeof(addr)) < 0)
{
    perror("bind");
    exit(1);
}

struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(group.c_str());
mreq.imr_interface.s_addr = (source_iface.empty()
                               ? htonl(INADDR_ANY)
                               : inet_addr(source_iface.c_str()));

if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
{
    perror("setsockopt");
    exit(1);
}
4

2 に答える 2

2

bind通話だけでなく、リッスンする特定のマルチキャスト アドレスも必要になると思います。setsockopt後者は、ネットワーク カードと IGMP が正しく動作することを確認するためにも必要です。

マルチキャスト (UDP) ソケットをバインドするとはどういう意味ですか?も参照してください。

于 2013-10-31T09:05:04.680 に答える