Boost Asio UDP服务器设置套接字监听指定的IP

时间:2016-09-23 14:23:05

标签: c++ boost udp boost-asio

当我在UDP服务器上工作时,我通常将套接字设置为侦听指定端口并接受任何IP。请注意,同步接收在这里可以正常使用。

std::unique_ptr<boost::asio::ip::udp::socket> socketUDP;    
socketUDP.reset(new udp::socket(io_serviceUDP, udp::endpoint(udp::v4(), 9999)));

但是,我真的希望有2个不同的服务器应用程序在同一个端口(9999)监听,但只接受一个I​​P(我已经知道IP)。每个应用程序都有自己的客户端和自己的IP。 但由于某种原因,以下操作无效(在应用程序中没有收到任何数据包,而Wireshark可以看到它)

socketUDP.reset(new udp::socket(m_io_serviceUDP, udp::endpoint(asio::ip::address::from_string("169.254.1.2"), 9999)));

请注意: 1)根据Issue with broadcast using Boost.Asio的答案,这实际上应该有效。当然,我的理解并不完全正确,因为我错过了一些东西

2)提供的IP有效,工作,发送数据(由wireshark确认)并且可以ping通

1 个答案:

答案 0 :(得分:2)

问题是您的socketUDP未配置:

set_option(boost::asio::ip::udp::socket::reuse_address(true));

但是,只需在套接字上调用上面的行就无法使用,因为在套接字绑定到端点之前必须先调用reuse_address ...但是你&# 39;使用udp::socket重新构建endpoint,将其打开将其绑定到端点,请参阅basic_datagram_socket

解决方案是调用只需要io_service的构造函数;打开它,设置reuse_address选项,然后 bind,例如:

// construct the socket
boost::asio::ip::udp::socket  socket_(io_service_);

// open it
boost::asio::ip::udp::endpoint rx_endpoint_(udp::v4(), 9999);
socket_.open(rx_endpoint_.protocol(), error);
if (error)
  return false;

// then set it for reuse and bind it
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true));
socket_.bind(rx_endpoint_, error);
if (error)
   return false;

// set multicast group, etc.
socket_.set_option(boost::asio::ip::multicast::join_group(ip_address));
...