在 TCP 中,我们说连接的一侧执行“主动关闭”,而另一侧执行“被动关闭”。
在 Linux 套接字 API 方面,如何区分主动关闭和被动关闭?
例如,假设我们有两个连接的 Linux TCP 套接字 A 和 P,它们已经通过应用程序级协议(protocol)交换了信息并且它们都知道是时候关闭它们的套接字了(既不期望发送也不接收任何彼此之间的更多数据)。
我们希望套接字 A 执行主动关闭,而 P 是被动关闭。
A 和 P 可以做一些事情。例如:
- 调用关闭(SHUT_WR)
- 调用 recv 并期望返回 0
- 关闭电话。
- 别的
A 应该将这些事情组合成什么,按什么顺序做?... P 应该将这些事情组合成什么,按什么顺序做?
最佳答案
In terms of the Linux sockets API, how do you differentiate the active close and the passive close?
“主动”关闭只是套接字的哪一侧首先发送 FIN
或 RST
数据包,通常通过调用 close()
.
What combination of these things and in what order should A do?... and what combination of these things and in what order should P do?
在实践中,其中大部分是特定于应用程序和应用程序协议(protocol)的。我将描述回答您问题的最低/典型要求,但您的里程数可能会有所不同,具体取决于您具体要完成的任务。
如果您想终止套接字 A 上一个方向或另一个(或两个方向)的通信,您可以首先调用套接字 A 上的 shutdown()
。根据您的描述,两个程序都已经知道它们已经完成,可能是由于应用程序协议(protocol)消息,所以这可能不是必需的。
您必须在套接字 A 上调用 close()
以关闭套接字并释放文件描述符。
在 Socket P 上,您只需继续读取直到 recv()
返回 0
,然后您必须调用 close()
关闭套接字并释放文件描述符。
要进一步阅读,有许多很好的教程,以及 Beej's Guide to Network Programming很受欢迎。
关于c - 就套接字 API 而言,主动关闭与被动关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39151696/