繁体   English   中英

通过升压 sockets 禁用 TIME_WAIT

[英]Disable TIME_WAIT with boost sockets

TL;博士

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 以允许套接字连接终止,而客户端套接字已经终止。

问题,再次:

有没有办法使用 Boost sockets 为 C++ 可执行文件在本地设置 TIME_WAIT 延迟选项? 如果是这样,怎么做?

更改 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.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM