【问题标题】:Boost Asio UDP server set socket to listen on specified IPBoost Asio UDP 服务器设置套接字以侦听指定 IP
【发布时间】:2016-09-23 14:23:05
【问题描述】:

当我在 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通

【问题讨论】:

  • 您现在可以使用它了吗?我使用 Boost 1.66 中的 UDP 多播示例,它可以工作。

标签: c++ boost udp boost-asio


【解决方案1】:

问题是您的socketUDP 没有配置:

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

但是,简单地在你的套接字上调用上面的行是行不通的,因为你必须调用reuse_address 套接字绑定到一个端点......但你正在构造@987654326 @ 使用 endpoint 打开它将其绑定到端点,请参阅basic_datagram_socket

解决方案是调用只接受io_service 的构造函数;打开它,设置 reuse_addressoption 和 then bind it,例如:

// 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));
...

【讨论】:

  • 我认为这是非常好的评论,但它解决了之后会发生的问题。现在即使是 1 台服务器也无法使用指定的 IP。
  • 我很遗憾听到@Arrr..UDP 接收器有一些代码可以工作(据我所知)here。它仅记录了TCP 套接字,但只需将tcp_adaptor 替换为udp_adaptor 并调用receive_multicast 函数。顺便说一句,您正在监听哪个端口:99994747
猜你喜欢
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
相关资源
最近更新 更多