【发布时间】:2013-02-05 12:15:46
【问题描述】:
我想使用 boost asio(udp) 将数据多播到系统中存在的所有网卡。 谁能帮助我理解如何做到这一点。我创建了以下示例,但它不起作用。发送到每个套接字的流数据正在混合,输出是单个接口上所有套接字数据的混合。
//例如 认为 发送到 Interface1 的数据是“Abcd”(注意:每个接口都有一个单独的套接字)
发送到接口 2 的数据是“xyz”
然后只从 Interface1 接收输出,输出流是混合的(例如“abxycdz”或“abxcdzy”等)
请帮助我理解这个问题。
for(int i=0;i<NoOfInterfcaes;i++)
{
Open("229.1.1.1",1000,sNetInterfcaeAddList[i],false);
}
....................................
for(int i=0;i<NoOfInterfcaes;i++)
{
send(dataBuffer,len);
}
....................................
void Open(std::string &multicastIp,int nPort, std::string& sNetInterfcaeIpAdd,bool broadcast)
{
m_sNetInterfcaeIpAdd=sNetInterfcaeIpAdd;
m_sMulticastIp=multicastIp;
m_nport = nPort;
m_broadcast = broadcast ;
// try and open socket
const ip::udp::resolver::query queryIF( ip::udp::v4(),multicastIp.c_str(), nPort );
///resolve the connection
m_resolver.async_resolve(queryIF,
boost::bind(&handle_resolve, this,
boost::asio::placeholders::error,
boost::asio::placeholders::iterator));
}
void handle_resolve(const boost::system::error_code& err,
boost::asio::ip::udp::resolver::iterator endpoint_iterator)
{
if (!err)
{
//make a connection
m_socket.async_connect(*endpoint_iterator,
boost::bind(&handle_connect, this,
boost::asio::placeholders::error, endpoint_iterator));
}
else
{
//error message
}
}
void handle_connect(const boost::system::error_code& error,
boost::asio::ip::udp::resolver::iterator endpoint_iterator)
{
if (!error)
{
//Select the network adaptor
m_socket.set_option( boost::asio::ip::multicast::outbound_interface( boost::asio::ip::address_v4::from_string(m_sNetInterfcaeIpAdd)));
m_socket.set_option( boost::asio::ip::multicast::enable_loopback(false));
if(m_broadcast)
{
boost::asio::socket_base::broadcast option(true);
m_socket.set_option(option);
}
}
else if (endpoint_iterator != boost::asio::ip::udp::resolver::iterator())
{
// The connection failed. Try the next endpoint in the list.
m_socket.close();
//try to connect
m_socket.async_connect(*endpoint_iterator,
boost::bind(&handle_connect, this,
boost::asio::placeholders::error, endpoint_iterator));
}
else
{
//
}
}
【问题讨论】:
-
我已经解决了这个问题。我认为我们必须为每个网络适配器使用单独的多播地址,并且需要调用 m_socket.set_option(boost::asio::ip::multicast::join_group(boost ::asio::ip::address_v4::from_string(m_sMulticastIp), boost::asio::ip::address_v4::from_string(m_sNetInterfcaeIpAdd)));在 m_socket.set_option( boost::asio::ip::multicast::outbound_interface( boost::asio::ip::address_v4::from_string(m_sNetInterfcaeIpAdd))) 之后;
标签: boost boost-asio multicast