c++ - C++ boost 1.72 在 tcp::socket 上重新连接,在 Linux 上抛出 WSAEADDRINUSE 异常,但在 Windows 上有效
问题描述
嗨,我的代码在 Windows 上可以正常工作,但在 linux 上,重新连接功能不起作用,它会抛出一个异常WSAEADDRINUSE
值。
pClientSocket = new tcp::socket(*pIO_context, tcp::endpoint(boost::asio::ip::make_address(127.0.0.1, 50001));
第一次它可以在 Windows 和 Linux 上运行,但是当我关闭套接字并尝试再次连接时,我只在 linux 操作系统上遇到了如上所述的异常。
这是关闭套接字代码。
boost::system::error_code ec;
pClientSocket->shutdown( boost::asio::socket_base::shutdown_type::shutdown_receive, ec);
pClientSocket->close(eCode);
delete pClientSocket;
pClientSocket= nullptr;
解决方案
尝试使用重用选项:
boost::asio::socket_base::reuse_address option(true);
socket.set_option(option);
更新:
这通常发生在我们尝试将服务器套接字绑定到已在使用或最近已使用的地址(并且套接字仍在等待操作系统清理)的地址。
对于客户端套接字,这不太常见,您必须通过在套接字中调用 bind() 来强制一个端口才能发生这种情况。
现在代码:
pClientSocket = new tcp::socket(*pIO_context, tcp::endpoint(boost::asio::ip::make_address(127.0.0.1, 50001));
boost::asio::socket_base::reuse_address option(true);
socket.set_option(option);
调用此构造函数重载。此构造函数创建套接字并尝试将其绑定到指定地址。它失败是因为您没有机会指定重用选项。
另一方面,这段代码:
pClientSocket = new tcp::socket(*pIO_context);
pClientSocket->open(boost::asio::ip::tcp::v4());
pClientSocket->set_option(socket_base::reuse_address(true));
boost::system::error_code ec;
pClientSocket->bind(tcp::endpoint(make_address(127.0.0.1, 50001), ec);
if (ec) { }
调用此构造函数重载,它只是创建套接字但不打开不连接它。这允许在绑定/连接等之前指定任何套接字选项。
推荐阅读
- batch-file - 如何接受任何文件作为输入并输出具有输入文件名的文件
- python-3.x - 如何计算滚动修剪方差/标准偏差?
- azure - 具有预先邀请用户的 Azure B2C
- csv - 如何存储非常大(csv)文件的行索引?
- flutter - 如何使用第一个 API 调用的结果作为第二个 API 调用的输入?
- android - 我如何要求用户身份验证仅用于解密而不是加密
- yaml - 将锚点和别名组合在一行中触发 parserError: 'Expected
, 但发现 ' ' - mysql - Mysql将列数据类型从整数更改为十进制(3,2)而不会丢失旧数据
- arrays - 如何处理 Reactjs 中的多个复选框?
- node.js - mongodb更改流从时间戳恢复