c - 套接字编程中shutdown()函数中SHUT_RDWR的用途

标签 c sockets networking berkeley-sockets

当我们调用shutdown()时带有参数 SHUT_RDWR 的套接字上的函数,我们停止了套接字上的读/写可能性,但套接字仍然没有被破坏。我无法理解 SHUT_RDWR 的目的。它给我们带来了什么,为什么我们需要一个没有读/写可能性的套接字?我预计SHUT_RDWR应该像close()一样工作功能,但事实并非如此。

最佳答案

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

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

但是,文件描述符仍然处于打开状态,这意味着如果还有任何数据可供您接收/读取,您可以继续执行,然后关闭文件描述符。

换句话说,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.

关于c - 套接字编程中shutdown()函数中SHUT_RDWR的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71546662/

相关文章:

c - 即使条件不为真,C 中的 while 循环也会退出

c - C 结构体中的 Sizeof 指针

c - 如何在启动另一个使用它的进程之前完全关闭文件写入?

c++ - 如何检查发送到特定端口上的 IP 地址的数据?

windows - Postgres ODBC : connection "actively refused"

hadoop - 无法将虚拟盒中的HDP 2.6沙盒与桥接网络连接

javascript - 如何查询XMLHttpRequest的方法类型?

c - 为什么函数调用会导致段错误?

python - 在 python 中处理和保存 UDP 流的最快方法

java - 为什么java socket没有读取到全部数据会报错