c++ - 已与 boost asio 接受器一起使用的地址

标签 c++ sockets boost boost-asio

我编写了一个服务器,用于监听传入的 TCP 连接和连接到它的客户端。当我关闭服务器并在同一端口上重新启动它时,我有时会在调用 bind(...) 时收到错误消息 EADDRINUSE(错误代码:Linux 上的 98)。即使我设置了重用套接字的选项,也会发生这种情况。

该错误并非一直发生,但似乎在客户端连接到服务器并在服务器关闭时发送数据时更常发生。我想问题是服务器关闭时仍然有挂起的连接(相关主题:https://stackoverflow.com/questions/41602/how-to-forcibly-close-a-socket-in-time-wait)。

在服务器端,我使用的是 boost::asio::ip::tcp::acceptor。我使用选项“reuse_address”对其进行初始化(参见 http://beta.boost.org/doc/libs/1_38_0/doc/html/boost_asio/reference/basic_socket_acceptor.html )。这是代码片段:

using boost::asio::ip::tcp;
acceptor acceptor::acceptor(io_service);
endpoint ep(ip::tcp::v4(), port);
acceptor.open(ep.protocol());
acceptor.set_option(acceptor::reuse_address(true));
acceptor.bind(ep);
acceptor.listen();

接受器关闭:

acceptor.close();

之前我也试过用acceptor.cancel(),效果一样。发生此错误时,我很长一段时间无法在同一端口上重新启动服务器。重新启动网络会有所帮助,但不是永久解决方案。

我错过了什么?

任何帮助将不胜感激! :)

最佳答案

这些最初是对问题的评论。


您的服务器会 fork 子进程吗?另外,您确定套接字处于 TIME_WAIT 状态吗?发生这种情况时,您可能希望获取 netstat -ap 输出

关于c++ - 已与 boost asio 接受器一起使用的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194087/

相关文章:

C++ - 使用基类作为模板参数

c++ - 将 C++ (DLL) 项目转换为 COM DLL 项目

c - 错误的文件描述符错误处理

c++ - Boost 状态机语言 - 来自 `post` 的 `action` 事件

c++ - 在 linux 中使用 boost xml_parser 如何读取和比较 windows-1251 文字?

c++ - Boost线程析构函数 undefined symbol

html - QDomDocument 按类获取元素

c - 我正在尝试使用 UDP 套接字将字符串从服务器回显到客户端,但它失败了?

c - accept() 是线程安全的吗?

c++ - 在 OSX El Capitan 中使用 Homebrew 的 Boost::Log 链接错误