当我在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)监听,但只接受一个IP(我已经知道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通
答案 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));
...