繁体   English   中英

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

[英]Boost Asio UDP server set socket to listen on specified IP

当我在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)根据以下答案: 使用Boost.Asio进行广播问题,这实际上应该有效。 当然,由于我遗漏了一些东西,我的理解并不完全正确

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

问题是你的socketUDP没有配置:

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

但是,简单地在套接字上调用上面的行是行不通的,因为在套接字绑定到端点之前必须调用reuse_address ...但是你正在用一个endpoint构建udp::socket ,它打开它并将它绑定到端点,请参阅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));
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM