如果我调用了shutdown(fd,SHUT_RDWR),但没有调用close(fd),会发生什么?

Wji*_*yao 5 sockets

如果我调用了shutdown(fd,SHUT_RDWR),但没有调用close(fd),会发生什么?

inline void CSocket::close()
{
    if (_socket_fd != INVALID_SOCKET)
    {
        ::shutdown(_socket_fd, SHUT_RDWR);
        ::close(_socket_fd);
        _socket_fd = INVALID_SOCKET;
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*421 -1

如果我调用 shutdown(fd,SHUT_RDWR),但不调用 close(fd),会发生什么?

  • 在网络上,将发送 FIN,这将导致对等方在读取任何挂起的数据后遇到流结束。
  • 套接字中的未来recv()read()调用将返回零,表示流结束。
  • 您将无法从此套接字发送。
  • 如果对等方尝试向您发送更多数据,会发生什么情况取决于系统:如果您的平台是 Windows,则会发出重置;如果是Unix,数据将被确认并丢弃;如果是Linux,数据将被确认并无用地保存在您的套接字接收缓冲区中,从那里您将永远无法检索它,并且最终将关闭您的接收窗口并阻止对等方发送。
  • 套接字描述符未关闭或释放给操作系统。

  • 当然,网络上会发生一些事情。由于此调用还会关闭套接字的写入端,因此会向对等方发送 FIN 数据包以表明这一点。对等套接字上的待处理或后续“read()”调用将返回 EOF(在常见套接字接口上,例如 POSIX)。 (2认同)