【发布时间】:2016-08-25 17:46:19
【问题描述】:
在 TCP 中,我们说连接的一侧执行“主动关闭”,另一侧执行“被动关闭”。
在 Linux 套接字 API 方面,如何区分主动关闭和被动关闭?
例如,假设我们有两个连接的 Linux TCP 套接字 A 和 P,它们通过应用程序级协议交换了信息,并且它们都知道是时候关闭它们的套接字了(都不希望发送或接收任何彼此之间的更多数据)。
我们希望套接字 A 执行主动关闭,而 P 是被动关闭。
A 和 P 可以做一些事情。例如:
- 调用关机(SHUT_WR)
- 调用 recv 并期望得到 0 回复
- 通话结束。
- 别的东西
这些东西的什么组合和A应该做的顺序?...这些东西的组合和P应该做的顺序是什么?
【问题讨论】:
-
BOTH A 和 P 应该执行 ALL 您提到的步骤:
shutdown(SHUT_WR),然后循环recv()直到它返回 close()。执行这些步骤的第一方开始关闭,然后另一方一旦检测到关闭就应该执行相同的步骤,因此双方都知道连接的两端都已正常关闭。 -
@RemyLebeau:所以没有办法控制哪一边是主动关闭,哪一边是被动?
-
没有真正的“主动”与“被动”接近。一方可能会被动地检测到另一方的关闭,但双方仍然需要关闭他们的连接端。但是,有“优雅”与“中止”关闭之类的东西,这取决于是否调用了
shutdown()以及是否在套接字上启用了 linger。你应该尽可能地争取优雅的结束。 -
@RemyLebeau “主动关闭”和“被动关闭”是已经使用了几十年的流行术语。像许多其他特定年龄的 C 程序员一样,我从 W. Richard Stevens UNIX 网络编程 那里学到了它,但我确信它们甚至早于他的使用。但是,这并不能否定您所说的其他任何内容。当然,连接的双方都应该在情况允许的情况下优雅地关闭。
-
@AndrewTomazos 双方都必须关闭。第一个这样做是“主动关闭”(使用我也不喜欢的术语),这可能由您的应用程序协议定义,出于其他原因,最好是客户端而不是服务器,但从简单终止连接的角度来看,它是无关紧要的。