【问题标题】:Multicast UDP packets to Multiple Interfaces (Multiple network adapters) in the system using boost asio使用boost asio将UDP数据包多播到系统中的多个接口(多个网络适配器)
【发布时间】: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::addr‌​ess_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


【解决方案1】:

每个适配器使用一个套接字,使用以下问题中的代码将每个套接字绑定到其适配器:Boost asio socket multicast to a specific ethernet interface

【讨论】:

  • 谢谢Eile,但问题是我如何获得接口地址。
  • 我认为 boost::asio 不可能,但最重要的操作系统的实现可以在 hwsd 中找到:github.com/Eyescale/hwsd/blob/master/hwsd/net/sys/module.cpp
  • @Ven:Boost.Asio 不可能,但是可以使用其他库,例如libuv 来查询系统的网络接口。 Here 是 libuv 介绍中的一个例子。
  • 谢谢 Eile,Twsansbury。这是有道理的。
  • 您好 Eile,我已经检查了您在上述链接中给出的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 2012-11-16
相关资源
最近更新 更多