在一个套接字(Linux,C)上订阅多个多播组

是否可以从一个套接字上的多个多播组接收数据?

例如:

void AddGroup(int sock, const char* mc_addr_str, int mc_port, const char* interface) { struct sockaddr_in mc_addr; memset(&mc_addr, 0, sizeof(mc_addr)); mc_addr.sin_family = AF_INET; mc_addr.sin_addr.s_addr = inet_addr(mc_addr_str); mc_addr.sin_port = htons(mc_port); if ((bind(sock, (struct sockaddr *) &mc_addr, sizeof(mc_addr))) < 0) { perror("bind() failed"); exit(1); } // construct an IGMP join request structure struct ip_mreq mc_req; mc_req.imr_multiaddr.s_addr = inet_addr(mc_addr_str); mc_req.imr_interface.s_addr = inet_addr(interface); if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*) &mc_req, sizeof(mc_req))) < 0) { perror("setsockopt() failed"); exit(1); } } 

此代码在添加一个多播组时起作用。 但是,当我尝试添加另一个,“绑定”失败。 我不太明白为什么绑定需要在那里呢? (但没有它的代码不工作)。

理想情况下,我想在同一个套接字上多次调用AddGroup。 这可能吗? 或者我需要每个组一个套接字,然后只使用轮询?

Solutions Collecting From Web of "在一个套接字(Linux,C)上订阅多个多播组"

您可以根据需要加入任意数量的多播组,使用带有IP_ADD_MEMBERSHIP选项(而不是bind()的适当setsockopt()调用。

你只绑定一次套接字。 第二次跳过绑定,看看会发生什么。

bind到IPv4的被动地址,例如0.0.0.0,并使用ASM或SSM来引入其他组,例如列出的IP_ADD_MEMBERSHIP

你只能bind一次。

您可以在单个套接字上加入您想要的多个组播组。 请参阅setsockopt(),IP_PKTINFO以了解您正在从中读取数据的组播组。

是的,这是可能的:查看链接中的示例( http://www.tenouk.com/modulee41c.html )通过几个步骤缩短它:

  1. 你用SO_REUSEADDR setsockopt
  2. 你在INADDR_ANY上绑定
  3. 您在每个想要接收数据报的组上使用IP_ADD_MEMBERSHIP来设置锁定。
  4. 在我看来,使用IP_PKTINFO给出一个选项来区分收到的数据包,但发件人必须小心准备( 设置UDP套接字的源IP )

我不相信有可能在一个给定的套接字上加入多个多播组。 套接字由源IP /端口和目的地IP /端口的配对定义。 操作系统不知道如何处理来自第二个IP /端口的数据,因为它没有套接字发送给它。

绑定是必要的注册与操作系统的连接。 这基本上就像注册一个文件句柄。

最好的办法是为每个多播组创建一个套接字,然后调用select()。 如果任何套接字有数据准备好读取,select()会通知您。

检查您的手册页上的socket(),bind()和select()的更多信息。