首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::asio::ip::multicast::join_group不工作

boost::asio::ip::multicast::join_group不工作
EN

Stack Overflow用户
提问于 2011-12-30 10:40:42
回答 2查看 7K关注 0票数 11

我试过example,但它不工作。显然,它没有设置IPPROTO_IP/IP_MULTICAST_IF选项。我只能找到IPPROTO_IP/IP_MULTICAST_IF的boost::asio::ip::multicast::outbound_interface,我尝试过,但失败了。有没有办法让boost::asio::ip::multicast在不调用c级setsockopt的情况下工作?

代码语言:javascript
复制
boost::asio::ip::udp::endpoint listen_endpoint(
    listen_address, multicast_port);
socket_.open(listen_endpoint.protocol());
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true));
socket_.bind(listen_endpoint);

// Join the multicast group.
socket_.set_option(
    boost::asio::ip::multicast::join_group(multicast_address));
EN

回答 2

Stack Overflow用户

发布于 2011-12-31 06:53:59

正确答案:

代码语言:javascript
复制
boost::asio::ip::udp::endpoint listen_endpoint(udp::v4(), multicast_port); 
...
socket_.set_option(multicast::join_group(
  address::from_string(multicast_address).to_v4(), 
  address::from_string(interface).to_v4()));
票数 7
EN

Stack Overflow用户

发布于 2013-01-11 14:42:00

我认为boost example code for udp multicast中有一个错误。

在示例代码中,它们将套接字绑定到本地接口,但是对于udp多播,您必须绑定到udp多播组IP和端口。

代码语言:javascript
复制
socket_.bind(listen_endpoint);

应该是:

代码语言:javascript
复制
socket_.bind(
    boost::asio::ip::udp::endpoint( multicast_address, multicast_port ) );

请参阅multicast howto

...对于要接收多播数据报的进程,它必须请求内核加入该组,并绑定这些数据报要发送到的端口。UDP层同时使用目的地址和端口来对数据包进行多路分解,并确定将它们发送到哪个(多个)套接字...

..。有必要通知内核我们对哪些多播组感兴趣。也就是说,我们必须要求内核“加入”这些多播组……

检查您是否在与netstat -g | grep <multicast_group_ip>的正确接口上加入群

这是我认为不正确的boost示例代码:

代码语言:javascript
复制
boost::asio::ip::udp::endpoint listen_endpoint(
    listen_address, multicast_port);
socket_.open(listen_endpoint.protocol());
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true));
socket_.bind(listen_endpoint);

// Join the multicast group.
socket_.set_option(
    boost::asio::ip::multicast::join_group(multicast_address));

socket_.async_receive_from(
    boost::asio::buffer(data_, max_length), sender_endpoint_,
    boost::bind(&receiver::handle_receive_from, this,
      boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8675623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档