【问题标题】:Disable TIME_WAIT with boost sockets使用 boost 套接字禁用 TIME_WAIT
【发布时间】:2019-11-21 20:50:17
【问题描述】:

TL;DR

我看到我的套接字位于 TIME_WAIT 中,使用 Ubuntu ss 工具在 Ubuntu 1804 中,但我在文档中找不到 boost 套接字或如何将时间延迟设置为 0这样套接字会立即关闭(或者更好的是,为我的应用程序将其设置为任意小的值。

我正在用 Boost asio 编写一个套接字应用程序。客户端和服务器都在使用 boost 套接字。我看到,当客户端发送关闭连接命令:mysocket.shutdown( boost::asio::ip::tcp::socket::shutdown_both, error_code);,并且我的客户端 C++ 应用程序在 2 秒后关闭时,我在 ss -ap | grep application_port 的输出中得到 TIME_WAIT。我一直在寻找 SO 和 Internet 寻找使用 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 套接字的 C++ 可执行文件在本地设置 TIME_WAIT 延迟选项?如果有,怎么做?

【问题讨论】:

  • 你不想这样做。避免 TIME_WAIT 的方法,如果它是一个问题,它不是,是确保你是接收第一个关闭的结束。换句话说,如果您是服务器,则让客户端关闭套接字,并让服务器通过关闭对关闭做出反应,当然还有读取超时以捕获流氓客户端。您希望 TIME_WAIT 状态在客户端而不是服务器上累积。

标签: c++ sockets boost-asio


【解决方案1】:

更改 SO_LINGER 选项应该会有所帮助:这是关于它的讨论: TCP option SO_LINGER (zero) - when it's required

出于这个原因,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 中有大量套接字,则很可能意味着客户端站点没有轻轻关闭连接。因此,如果您可以修改客户端代码,则可以将其视为第一选择。这里有一个很好的解释,关于如何轻轻地完成 TCP 套接字上的通信(这不是关于 boost,但逻辑是一样的)Properly close a TCP socket

很可能您没有关闭套接字。关闭操作仅通知该对等方将没有更多数据要读取。所以很可能你必须: - 呼叫关机 - 确保没有更多可阅读的内容 - 关闭套接字

【讨论】:

  • 根本不是这个意思。这仅意味着您在对等方之前关闭了套接字。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多