在windows下使用boost::asio进行Udp广播

udp broadcast using boost::asio under windows

本文关键字:asio 进行 Udp 广播 boost windows      更新时间:2023-10-16

我有一个应用程序的udp广播小节的问题。我在windows 10下使用boost 1.62.0。

void test_udp_broadcast(void)
{
  boost::asio::io_service io_service;
  boost::asio::ip::udp::socket socket(io_service);
  boost::asio::ip::udp::endpoint remote_endpoint;
  socket.open(boost::asio::ip::udp::v4());
  socket.set_option(boost::asio::ip::udp::socket::reuse_address(true));
  socket.set_option(boost::asio::socket_base::broadcast(true));
  remote_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4::any(), 4000);
  try {
    socket.bind(remote_endpoint);
    socket.send_to(boost::asio::buffer("abc", 3), remote_endpoint);
  } catch (boost::system::system_error e) {
    std::cout << e.what() << std::endl;
  }
}

我收到:send_to:请求的地址在其上下文中无效从钓上来的。

我尝试将端点从any()更改为broadcast(),但是这只会在bind()上抛出相同的错误。

我通常在linux下编程,这段代码在我的正常目标上工作。所以我抓耳挠腮,不知道我哪里做错了。谁能给我指点一下正确的方向?

我相信您希望使用any()将套接字绑定到本地端点(如果您希望接收广播数据包-参见此问题),并使用broadcast()发送到远程端点(参见此问题)。

下面的代码为我编译并且不抛出任何错误:

void test_udp_broadcast(void)
{
  boost::asio::io_service io_service;
  boost::asio::ip::udp::socket socket(io_service);
  boost::asio::ip::udp::endpoint local_endpoint;
  boost::asio::ip::udp::endpoint remote_endpoint;
  socket.open(boost::asio::ip::udp::v4());
  socket.set_option(boost::asio::ip::udp::socket::reuse_address(true));
  socket.set_option(boost::asio::socket_base::broadcast(true));
  local_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4::any(), 4000);
  remote_endpoint = boost::asio::ip::udp::endpoint(boost::asio::ip::address_v4::broadcast(), 4000);
  try {
    socket.bind(local_endpoint);
    socket.send_to(boost::asio::buffer("abc", 3), remote_endpoint);
  } catch (boost::system::system_error e) {
    std::cout << e.what() << std::endl;
  }
}