如何从多个多播远程接口接收?

时间:2011-03-31 19:12:18

标签: c++ sockets boost udp multicast

我正在使用Boost :: asio作为以下内容。

我正在尝试从多个udp多播通道接收数据包。但是,我试图让这个工作起来很麻烦。目前,我只能收听第一个频道。

以下是我的代码:

// create a list of endpoints for each channel

endpoint_list.push_back(new boost::asio::ip::udp::endpoint( (boost::asio::ip::address::from_string(boost::get<1>(interfaces_list[i]))).to_v4(), boost::get<2>(interfaces_list[i])));

// create a list of join_groups for each channel

join_group_list.push_back(new boost::asio::ip::multicast::join_group( (boost::asio::ip::address::from_string(boost::get<1>(interfaces_list[i]))).to_v4(),   (boost::asio::ip::address::from_string(boost::get<0>(interfaces_list[i]))).to_v4() ) );

//initiate options on each channel

socket_list[i]->open(endpoint_list[i]->protocol());     socket_list[i]->set_option(boost::asio::ip::udp::socket::reuse_address(true));
socket_list[i]->bind(*endpoint_list[i]);
socket_list[i]->set_option(*join_group_list[i]);

// callback on each socket

socket_list[i]->async_receive_from(boost::asio::buffer(buffer_array_list[i], max_length), sender_endpoint_, boost::bind(&PacketLogger::HandleReceiveFrom, this, i, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

如您所见,每个频道都有自己的套接字等。我有3条信息:本地接口/远程接口/远程端口,所有这些都是正确的,因为我可以在第一个频道上完全听完。

有没有人对可能出现的问题有任何想法?

感谢。

1 个答案:

答案 0 :(得分:0)

IP多播是在主机级别而不是套接字级别进行管理的,如果您有两个冲突的套接字订阅,则会出现故障。

例如,您可以通过IP_MULTICAST_IF选项以只发送模式加入组,随后该计算机上的任何应用程序都无法订阅该组上的任何数据。

要继续尝试第三方应用程序中的订阅,或者改为使用一些基本的C代码。