能够关闭(close)一个套接字,为何还使用shutdown

  1. 只有一个最后一个活动关闭时,close才释放网络断点。这意味着如果复制一个套接字(如采用dup),要直到关闭了最后一个引用它的文件描述符才会释放这个套接字。而shutdown允许使一个套接字处于不活动状态,和引用它的文件描述符无关

  2. 有时可以很方便地关闭套接字双向传输中的一个方向。例如,如果想让所通信的进程能够确定数据传输何时结束,可以关闭该套接字的写段,然而通过该套接字读端仍可以继续接受数据

注意

在unix中调用了shutdown后,以shutdown(s, 0)为例,此函数为关闭s的接收端,unix会刷新输入队列,以丢弃应用程序还未读取的所有数据。如果有新数据到达,TCP会进行ACK,然后悄悄地将其丢弃。因为应用程序再也无法接收数据了

shutdown(s,1)关闭连接的发送端。将套接字标识为无法发送任何额外的数据,后继所有试图对套接字进行的写操作都会出错。将发送缓冲区中所有的数据都发送出去之后,TCP会向其对等实体发送一个FIN,通知它没有其他数据了。这被称为半关闭(half close)

只有关闭连接的发送端被称为半关闭,它虽然也发送FIN,但此FIN与close的FIN有差别,这个FIN表示的是“我已经完成了数据的传送,因此发送一个FIN到另一端,但我还想接收另一端发来的消息,直到他给我发来文件结束(FIN)