gpt4 book ai didi

c++ - 套接字上的 IP_ADD_MEMBERSHIP,套接字也会收听单播吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:38 30 4
gpt4 key购买 nike

考虑下面的代码,

我正在尝试为多播绑定(bind)一个 UDP 套接字。
我已经将它绑定(bind)到一个特定的端口,并设置 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);
}

最佳答案

我相信您还需要绑定(bind)您想要收听的特定多播地址,而不仅仅是在 setsockopt 调用中 - 后者也是有必要确保网卡和 IGMP 也做正确的事情。

另见 What does it mean to bind a multicast (UDP) socket?

关于c++ - 套接字上的 IP_ADD_MEMBERSHIP,套接字也会收听单播吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19702165/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com