c - 就套接字 API 而言,主动关闭与被动关闭?

标签 c linux sockets tcp

在 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?

“主动”关闭只是套接字的哪一侧首先发送 FINRST 数据包,通常通过调用 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/

相关文章:

c - 如何减少 C 代码中的代码重复(由于空指针而不确定)

c - C 中有类似 "Beginning of file"的东西吗?

xml - 在 Linux 上运行进程的 shell 脚本

Linux 2.3.36 设备文件系统省略

linux - Grep: Unknown syntax for entry(在两台不同的机器上:一台机器的结果很好,另一台是错误的)

c - x86 和 x86-64 之间的套接字和可移植性

node.js - Nodejs 最大套接字池设置

c - 一种方法会引发段错误,而另一种则不会。有什么不同?

c++ - 按值传递 2D 数组不起作用

将 float 数据转换为必须通过 UDP 发送的 Char 数据