socket编程中shutdown()函数中SHUT_RDWR的用途

Purpose of SHUT_RDWR in shutdown() function in socket programming

当我们使用参数SHUT_RDWR在套接字上调用shutdown()函数时,我们停止了套接字上的read/write可能性,但套接字仍然没有被销毁。我无法理解 SHUT_RDWR 的目的。它给了我们什么,为什么我们需要一个没有 read/write 可能性的套接字?我希望 SHUT_RDWR 应该像 close() 函数一样工作,但事实并非如此。

SHUT_RDWR 的作用是关闭套接字上的连接,同时保持数据句柄(文件描述符)打开。

例如,假设套接字已用于 two-way 通信,而您的连接端使用 SHUT_RDWR 将其关闭。然后,如果连接另一端的人尝试写入(也许还读取?),它将失败,因为连接已关闭。

但是,文件描述符仍处于打开状态,这意味着如果有任何数据留给您receive/read,您可以继续进行,然后关闭文件描述符。

换句话说,shutdown() 是关于关闭连接,而 close() 是关于关闭文件描述符并丢弃可能在文件描述符的“缓冲区”中的任何数据。

UNIX环境高级编程也有这个原因:

Given that we can close a socket, why is shutdown needed? There are several reasons. First, close will deallocate the network endpoint only when the last active reference is closed. If we duplicate the socket (with dup, for example), the socket won’t be deallocated until we close the last file descriptor referring to it. The shutdown function allows us to deactivate a socket independently of the number of active file descriptors referencing it.