1

ブースト asio(udp) を使用して、システムに存在するすべてのネットワーク カードにデータをマルチキャストしたいと考えています。次の例を作成しましたが、機能しません。各ソケットに送信されるストリーム データが混在し、出力は単一のインターフェイス上のすべてのソケット データの混在です。

//eg Interface1 に送信されたデータが "Abcd" であると仮定します (注: 各インターフェイスには個別のソケットがあります)

Interface2に送信されるデータは「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
   {
      //
   }
}
4

1 に答える 1

1

アダプタごとにこの 1 つのソケットを使用し、次の質問のコードを使用してそれぞれをそのアダプタにバインドします: Boost asio socket multicast to specific ethernet interface

于 2013-02-05T19:26:44.537 に答える