2011-12-30 151 views
8

我试过了example,但它不起作用。显然它没有设置IPPROTO_IP/IP_MULTICAST_IF选项。我只能找到boost :: asio :: ip :: multicast :: outbound_interface IPPROTO_IP/IP_MULTICAST_IF,我试过但失败了。有没有什么办法可以让boost :: asio :: ip :: multicast工作,而不需要调用c-level setsockopt?boost :: asio :: ip :: multicast :: join_group不起作用

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)); 
+2

使用'multicast :: join_group(multicast_address,listen_endpoint.address()。to_v4())'。 – 2011-12-30 14:04:41

+1

感谢您的提醒。刚刚尝试过,我们必须将“0.0.0.0”设置为listen_endpoint。所以工作版本是 boost :: asio :: ip :: udp :: endpoint listen_endpoint(udp :: v4(),multicast_port); ... socket_.set_option(multicast :: join_group(address :: from_string(group _)。to_v4(), address :: from_string(interface).to_v4())); – poordeveloper 2011-12-30 16:21:04

+0

@Stefan发表您的评论作为答案 – 2011-12-30 18:28:28

回答

4

正确答案:

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())); 
+5

界面是什么? – user997112 2014-06-12 12:16:52

+0

接口实际上是您的本地地址来过滤传入的数据包。 – iyasar 2017-10-10 12:07:25

5

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

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

socket_.bind(listen_endpoint); 

应该是:

socket_.bind(
    boost::asio::ip::udp::endpoint(multicast_address, multicast_port)); 

看到multicast howto

...一个过程接受它有权要求内核 加入该组并绑定多播数据报端口那些数据报被发送到 到。 UDP层使用目的地址和端口号来解复用数据包并决定将哪些数据包传送给...

...有必要告诉内核我们对 感兴趣的组播组也就是说,我们要问的内核“加入”那些 组播组...如果

检查你加入群组正确的接口与netstat -g | grep <multicast_group_ip>

这是我认为不正确升压示例代码:

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));