【发布时间】: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