IP_ADD_MEMBERSHIP套接字上,套接字是否也会侦听单播
IP_ADD_MEMBERSHIP on a socket, will the socket listen to unicast also?
考虑下面的代码,
我正在尝试为多播绑定 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);
}
我相信
您还需要bind
要侦听的特定组播地址,而不仅仅是在setsockopt
呼叫中 - 后者对于确保网卡和IGMP也做正确的事情也是必要的。
另请参阅绑定多播 (UDP) 套接字是什么意思?
好的,我让我的实例工作,所以我知道问题是什么。必须针对多播 IP 地址进行bind()
:
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = (group.empty()
? htonl(INADDR_ANY) // <-- this will work here but not below
: inet_addr(group.c_str()));
if (bind(fd,(struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
exit(1);
}
这里的区别是group
而不是source_iface
.在我更改之前,它根本不会接收广播数据包。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 如何在 Linux 上的 C/C++ 中使用 ipv6 udp 套接字进行多播?
- C++套接字编程,带压缩的多播,任何好的库/包装器
- IP_ADD_MEMBERSHIP套接字上,套接字是否也会侦听单播
- Unix 多播套接字线程安全吗?
- 单套接字通过 WLAN 和 ETH 接口发送和接收
- 是否可以获得多播组中每个套接字的所有sockaddr_in地址的列表
- 以最低的延迟从linux中的多播套接字接收数据
- 如何使多播套接字不接收单播数据?
- Linux套接字作为多播服务器和客户端
- Linux组播后续套接字窃取数据
- c++套接字-多端口或单端口