15

使用 Winsock 通过套接字发送数据后,您应该像这样关闭连接:

closesocket(ConnectSocket);
WSACleanup();

我正在编写一个通过套接字发送数据的 API。如果之后我必须关闭套接字,我需要向 API 添加一个函数,以便用户可以说他们何时完成获取数据。为方便起见,如果我不关闭套接字会不会有问题?

4

1 回答 1

22

一种或另一种方式,如果您不关闭套接字,您的程序将泄漏文件描述符。程序通常只能打开有限数量的文件描述符,所以如果这种情况发生很多,它可能会变成一个问题。

如果套接字绑定到一个地址,则在套接字关闭之前,没有其他套接字能够绑定到相同的地址。如果它绑定到一个众所周知的端口(例如 25 或 80),这将阻止其他任何东西绑定到该端口......这可能是您可能面临的最严重的问题。如果它绑定到一个临时端口,这并不那么重要,但是,端口数量仍然有限,如果这种情况发生很多,那么你可能会用完。请注意,UDP 套接字可以自由使用而无需绑定,因此此问题可能不适用于 UDP 套接字。

如果套接字是侦听套接字(listen()已在其上调用),如果您不关闭它,系统将继续接受此套接字上的连接(但仅限于 中指定的积压限制listen())。

shutdown()如果套接字是一个TCP套接字并且它是连接的,那么除非套接字被关闭或被调用,否则TCP连接不会被关闭。因此,在这种情况下,您至少应该确保在shutdown()无法关闭套接字时调用。

总之,不关闭套接字可能会导致一些或多或少重要的问题。通常,您可以预期 TCP 比 UDP 会出现更多问题。如果可能的话,当你完成它们时,你绝对应该关闭它们!

于 2013-06-12T23:50:21.017 回答