【发布时间】:2012-10-03 12:33:43
【问题描述】:
我必须实现一个多播接收器,它能够加入多播组列表并使用 boost 在特定线程中处理接收到的数据。我确实尝试了以下代码.....
boost::asio::io_service m_io_service;
boost::asio::ip::udp::socket m_multicast_socket(m_io_service);
// listen address
boost::asio::ip::address listen_address
= boost::asio::ip::address::from_string("0.0.0.0");
// listen port
unsigned short multicast_port = m_configuration->m_multicast_interface_port;
boost::asio::ip::udp::endpoint listen_endpoint( listen_address, multicast_port );
// open socket
m_multicast_socket.open( listen_endpoint.protocol() );
// set socket buffer size
m_multicast_socket.set_option(
boost::asio::ip::udp::socket::receive_buffer_size
( m_configuration->m_receiving_socket_buffer_size ) );
// other sockets could bind to listen_address
m_multicast_socket.set_option( boost::asio::ip::udp::socket::reuse_address(true) );
boost::asio::socket_base::bytes_readable num_of_bytes_readable(true);
m_multicast_socket.io_control(num_of_bytes_readable);
m_multicast_socket.bind(listen_endpoint);
// joining a list of multicast group
for ( size_t i=0; i < multicast_groups.size(); ++i )
{
boost::asio::ip::address multicast_address
= boost::asio::ip::address::from_string( multicast_groups[i] );
m_multicast_socket.set_option(
boost::asio::ip::multicast::join_group(
multicast_address ) );
std::cout << multicast_groups[i] << " multicast group joined!" << std::endl;
}
然后无限循环读取数据......
while ( !m_exit )
{
while ( !num_of_bytes_readable.get() )
{
boost::this_thread::sleep( boost::posix_time::milliseconds( 1 ) );
}
boost::asio::ip::udp::endpoint sender_endpoint;
size_t bytes_received = m_multicast_socket.receive_from(
boost::asio::buffer( m_reading_buffer.get(), m_configuration->m_reading_buffer_size )
, sender_endpoint );
if ( bytes_received > 0 )
{
// process
}
boost::this_thread::yield();
}
但是没有接收到数据并且循环......
while ( !num_of_bytes_readable.get() )
{
boost::this_thread::sleep( boost::posix_time::milliseconds( 1 ) );
}
永不退出。
我也尝试了 boost asio 文档中的多播接收器示例的代码
但async_recv_from 永远不会返回。
【问题讨论】:
-
每个多播组需要一个套接字。
-
我尝试加入单个多播组,但没有收到任何数据。关键是连接似乎失败了。
-
我们确实使用 boost::asio 来多播数据。我还没有阅读您的代码,但也许这会有所帮助:github.com/Eyescale/Collage/blob/master/co/…
标签: c++ boost-asio multicast