在套接字API方面主动关闭与被动关闭?

And*_*zos 5 c sockets linux tcp

在TCP中,我们说连接的一侧执行"主动关闭"而另一侧执行"被动关闭".

就Linux套接字API而言,您如何区分主动关闭和被动关闭?

例如,假设我们有两个连接的Linux TCP套接字A和P,它们通过应用程序级协议交换信息,并且它们都知道是时候关闭它们的套接字(既不希望发送或接收更多数据到或彼此).

我们希望套接字A执行主动关闭,而P则是被动关闭.

A和P可以做一些事情.例如:

  • 呼叫关闭(SHUT_WR)
  • 打电话给recv,期待0回来
  • 打电话给.
  • 别的

这些东西的组合以及A应按什么顺序进行?......以及这些东西的组合以及P应按什么顺序进行?

Lar*_*ary 3

就Linux套接字API而言,如何区分主动关闭和被动关闭?

“主动”关闭就是套接字的哪一侧首先发送FINRST数据包,通常通过调用close().

A 应该如何组合这些事情以及以什么顺序进行?……P 应该如何组合这些事情以及以什么顺序进行?

实际上,其中大部分是特定于应用程序和应用程序协议的。我将描述回答您的问题的最低/典型要求,但您的里程可能会有所不同,具体取决于您具体想要完成的任务。

如果您想终止套接字 A 上一个方向或另一个方向(或两个方向)的通信,您可以首先调用套接字A。根据您的描述,两个程序已经知道它们已完成,可能是由于应用程序协议消息,因此这可能shutdown()没有必要。

必须调用close()套接字 A 才能关闭套接字并释放文件描述符。

在套接字 P 上,您只需继续读取直到recv()returns 0,然后您必须 调用close()以关闭套接字并释放文件描述符。

为了进一步阅读,有很多很好的教程,Beej 的网络编程指南非常受欢迎。