当使用 TCP 套接字时,有什么作用
shutdown(sock, SHUT_RD);
实际上呢?它只是让所有 recv()
调用返回一个错误代码吗?如果是,是哪个错误代码?
它会导致底层 TCP 连接发送任何数据包吗?另一方此时发送的任何数据会发生什么情况 - 它是否保留,并且连接的窗口大小一直缩小直到它变为 0,或者它只是被丢弃,窗口大小不缩小?
最佳答案
关闭套接字的读取端将导致任何阻塞的recv
(或类似)调用返回0
(表示正常关闭)。我不知道当前在 IP 堆栈上传输的数据会发生什么情况。它肯定会忽略来自另一端的传输中的数据。它根本不会影响对该套接字的写入。
事实上,明智地使用shutdown
是确保您在完成后立即清理的好方法。不使用 keepalive 的 HTTP 客户端可以在发送完请求后立即关闭写入端,而看到 Connection: closed
的服务器同样可以尽快关闭读取端它已完成接收请求。这将导致任何进一步的错误事件立即显而易见,这在编写协议(protocol)级代码时非常有用。
关于networking - shutdown(sock, SHUT_RD) 与 TCP 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/740817/