我需要关闭插座吗?

1''*_*1'' 6 sockets tcp winsock

在使用Winsock通过套接字发送数据后,您应该关闭连接,如下所示:

closesocket(ConnectSocket);
WSACleanup();
Run Code Online (Sandbox Code Playgroud)

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

Cel*_*ada 14

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

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

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

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

总之,不关闭插座可能会导致一些或多或少重要的问题.通常,TCP可能会遇到比UDP更多的问题.当你完成它们时,你绝对应该关闭套接字!