networking - shutdown(sock, SHUT_RD) 与 TCP 的行为

标签 networking sockets network-programming tcp

当使用 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/

相关文章:

javascript - javascript可以获取当前WiFi连接的SSID吗?

Java UrlConnection 在高负载下触发 "Connection reset"异常。为什么?

java - InputStream "lags/stuns"应用一段时间

networking - 了解内核中的 'struct proto'和 'struct proto_ops'

c# - 某种类型的断开连接后无法重新连接套接字,重新启动有效

sockets - 如何从套接字读取数据,直到客户端停止发送?

c - 套接字编程将多个客户端连接到一台服务器并列出它们 C

c# - lock 和 Thread.Interrupt 哪个更快?

java - 服务器 - 客户端与 Java 套接字通信

c sendto函数在linux2.6.29中设置 “network is unreachable” errno