boost asio UDP 套接字收到“Netork 无法访问”错误。可以恢复吗?

问题描述 投票:0回答:1

我正在使用 UDP 套接字的 boost 包装器与远程服务器进行通信。这是该套接字的初始化流程(为了便于阅读,省略了错误处理。)

std::shared_ptr<boost::asio::ip::udp::socket> socket

socket = std::make_shared<boost::asio::ip::udp::socket>(ioctx);

socket->open(boost::asio::ip::udp::v4(), ec);

boost::asio::ip::address server = boost::asio::ip::make_address(
     server_ip, ec);

boost::asio::ip::udp::endpoint endpoint(server, port);

socket->connect(endpoint);

初始化后,我从套接字读取数据,在极少数情况下,我会看到“网络无法访问”错误代码,该代码不是套接字接收系统调用的一部分。

auto bytes = socket->receive(
             boost::asio::buffer(packet->get_pkt(), 
             packet->get_buffer_size()), 
             0,
-->          ec);

所以我想知道boost库是否在包装器中添加了这个错误,以及我是否可以继续使用这个套接字或者必须重新创建连接。

谢谢!

c++ sockets boost udp
1个回答
0
投票

因此,

network_unreachable
ENETUNREACH
或9916)永远不会在Boost代码中显式引发。

如果你使用的是 Windows,它可能是从

翻译过来的
  • 0x2742
    ::GetLastError()
    返回。我假设您使用的是 POSIX,因为您提到了系统调用。
  • WSAENETUNREACH_
    翻译为
    error_condition

唯一明确提及该错误的地方是在

complete_iocp_connect
中,它翻译了 IOCP 特定错误。


目的地无法到达

ICMP 文档页面 阐明:

总结:网络不可达

  1. 指定的目标地址是否是有效的网络?
  2. 路由器的链路是否已发送网络不可达消息?
  3. 路由器中的端口是否配置了正确的地址掩码值?

[...]

总结:主机无法访问

  1. 您可以放心,干预通信基础设施运行正常。
  2. 指定的目标地址是主机的正确地址吗?
  3. 主持人当前在线且活跃吗?
  4. 目标网络是否存在任何物理问题。

UDP 在概念上与 ICMP 非常相似(因为它们是同一层上的数据报协议)。我强烈建议您阅读整个链接页面,因为它为您提供了许多现实生活场景,这些场景通常会导致报告特定的错误情况。

总结

系统调用将返回 ENETUNREACH。发生这种情况的条件是当您的地址/掩码隐含的接口(暂时)未(正确)配置时。查看某些系统进程是否导致周期性网络变化。

© www.soinside.com 2019 - 2024. All rights reserved.