[英]Disable TIME_WAIT with boost sockets
I see that my sockets are in TIME_WAIT
with the ss
tool in Ubuntu 1804
, but I can't find in the docs for boost sockets or on SO how to set the time delay to 0
such that the socket immediately closes (or better yet,将它设置为我的应用程序的任意小值。
我正在用 Boost asio 编写一个套接字应用程序。 客户端和服务器都使用 boost sockets。 我看到,当客户端发送关闭连接命令时: mysocket.shutdown( boost::asio::ip::tcp::socket::shutdown_both, error_code);
,并且我的客户端 C++ 应用程序在 2 秒后关闭,我在ss -ap | grep application_port
的 output 上得到TIME_WAIT
| ss -ap | grep application_port
。 我一直在寻找 SO 和互联网寻找使用 Boost C++设置TIME_WAIT
的方法,但相反,我一直在寻找关于为什么会发生TIME_WAIT
的问题。 这里有一些:
https://stackoverflow.com/questions/14666740/receive-data-on-socket-in-time-wait-state
https://stackoverflow.com/questions/35006324/time-wait-with-boost-asio
https://stackoverflow.com/questions/47528798/closing-socket-cause-time-wait-pending-state
如果我正确解释了互联网(以及 TCP 协议),则 TIME_WAIT 发生的原因是因为服务器连接正在等待 ACK 以允许套接字连接终止,而客户端套接字已经终止。
问题,再次:
更改 SO_LINGER 选项应该会有所帮助:这是关于它的讨论: TCP option SO_LINGER (zero) - 当它需要时
出于这个原因,Boost 具有 api,因此您可以尝试将 linger 更改为 0:
boost::asio::ip::tcp::socket socket(io_service);
boost::asio::socket_base::linger option(true, 30);
socket.set_option(option);
https://www.boost.org/doc/libs/1_50_0/doc/html/boost_asio/reference/socket_base/linger.html
无论如何,最好确定你是否真的必须这样做。 如果您在 TIME_WAIT 中有大量 sockets,则很可能意味着客户端站点没有轻轻关闭连接。 因此,如果您可以修改客户端代码,则可以将其视为第一选择。 这是关于如何轻轻完成 TCP 套接字上的通信的很好的解释(这不是关于升压,但逻辑是相同的) 正确关闭 TCP 套接字
很可能您没有关闭套接字。 关闭操作仅通知该对等方将没有更多数据要读取。 所以很可能你必须: - 调用关机 - 确保没有更多要阅读的内容 - 关闭套接字
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.