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

2023-11-24

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

例如:

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。这可能吗?或者我是否需要每组一个套接字,然后只使用轮询?


您可以使用适当的方法加入任意数量的多播组setsockopt()使用IP_ADD_MEMBERSHIP 选项调用,而不是bind()。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在一个套接字上订阅多个多播组(Linux、C) 的相关文章

随机推荐