Ven
Ven

Reputation: 247

Multicast UDP packets to Multiple Interfaces (Multiple network adapters) in the system using boost asio

I want to multicast data to the all the network cards present in the system using boost asio(udp). Can anyone help me in understanding how this can be done.I have created following example but its not working.The stream data send to each socket is getting mixed and the output is a mix of all sockets data on a single interface.

//e.g Assume data send to Interface1 is "Abcd"(Note: each interface has a separate socket)

data send to Interface2 is "xyz"

Then the output is only received from Interface1 ,the out stream is mixed(e.g "abxycdz" or "abxcdzy" etc)

Please help me in understanding the issue.

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
   {
      //
   }
}

Upvotes: 1

Views: 4010

Answers (1)

eile
eile

Reputation: 1153

You use this one socket per adapter, binding each to its adapter using the code from this question: Boost asio socket multicast to a specific ethernet interface

Upvotes: 1

Related Questions