地址已经与boost asio接受器一起使用

Ale*_*der 10 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();
Run Code Online (Sandbox Code Playgroud)

接受者关闭时:

acceptor.close();
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么?

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

Sam*_*ler 0

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


您的服务器是否分叉子进程?另外,您确定套接字处于 TIME_WAIT 状态吗?netstat -ap发生这种情况时您可能想要获取输出