我需要关闭插座吗?

时间:2013-06-12 23:32:54

标签: sockets tcp winsock

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

closesocket(ConnectSocket);
WSACleanup();

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

1 个答案:

答案 0 :(得分:12)

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

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

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

如果套接字是TCP套接字且已连接,则除非关闭套接字或调用shutdown(),否则不会关闭TCP连接。因此,在这种情况下,如果您无法关闭套接字,至少应该确保拨打shutdown()

总之,不关闭套接字可能会导致一些或多或少重要的问题。通常,TCP可能会遇到比UDP更多的问题。如果可能的话,你绝对应该关闭套接字!