我正在使用 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库是否在包装器中添加了这个错误,以及我是否可以继续使用这个套接字或者必须重新创建连接。
谢谢!
因此,
network_unreachable
(ENETUNREACH
或9916)永远不会在Boost代码中显式引发。
如果你使用的是 Windows,它可能是从
翻译过来的0x2742
由 ::GetLastError()
返回。我假设您使用的是 POSIX,因为您提到了系统调用。WSAENETUNREACH_
翻译为 error_condition
唯一明确提及该错误的地方是在
complete_iocp_connect
中,它翻译了 IOCP 特定错误。
此 ICMP 文档页面 阐明:
总结:网络不可达
- 指定的目标地址是否是有效的网络?
- 路由器的链路是否已发送网络不可达消息?
- 路由器中的端口是否配置了正确的地址掩码值?
[...]
总结:主机无法访问
- 您可以放心,干预通信基础设施运行正常。
- 指定的目标地址是主机的正确地址吗?
- 主持人当前在线且活跃吗?
- 目标网络是否存在任何物理问题。
UDP 在概念上与 ICMP 非常相似(因为它们是同一层上的数据报协议)。我强烈建议您阅读整个链接页面,因为它为您提供了许多现实生活场景,这些场景通常会导致报告特定的错误情况。
系统调用将返回 ENETUNREACH。发生这种情况的条件是当您的地址/掩码隐含的接口(暂时)未(正确)配置时。查看某些系统进程是否导致周期性网络变化。