C++ close()和closesocket()可以互换吗?

C++ close()和closesocket()可以互换吗?,c++,sockets,networking,winsock2,C++,Sockets,Networking,Winsock2,我在这里看到了很多答案,说使用close()销毁套接字,但我在中使用的指南让我使用closesocket()。我想知道是否有区别,是否有理由使用其中一个或另一个 在这两种情况下,我都看到了使用shutdown()的建议,这样做很好。close()是一个*nix函数。它可以在任何文件描述符上工作,*nix中的套接字就是文件描述符的一个示例,因此它也可以正确地关闭套接字 closesocket()是Windows特有的函数,专门用于套接字。Windows上的套接字不使用*nix样式的文件描述符,so

我在这里看到了很多答案,说使用close()销毁套接字,但我在中使用的指南让我使用closesocket()。我想知道是否有区别,是否有理由使用其中一个或另一个

在这两种情况下,我都看到了使用shutdown()的建议,这样做很好。

close()
是一个*nix函数。它可以在任何文件描述符上工作,*nix中的套接字就是文件描述符的一个示例,因此它也可以正确地关闭套接字

closesocket()
是Windows特有的函数,专门用于套接字。Windows上的套接字不使用*nix样式的文件描述符,
socket()
返回内核对象的句柄,因此必须使用
closesocket()
关闭它

我觉得BSD套接字没有包含特定的
socket
函数对应项是相当丢脸的,它可以在任何地方使用,但这就是生活


最后,但并非最不重要的一点,不要将关闭插座与关闭插座混淆
shutdown()
停止套接字上的传输,但套接字仍保留在系统中,并且与之相关的所有资源仍保留在系统中。关闭套接字后,您仍然需要关闭它。

您确定没有混淆linux(close())和Windows(closesocket())吗?我相信
close()
是一个*nix函数
closesocket()
是Windows的等价物。BSD以十年之久位居第一。他们没有预测未来,但这并不是什么丢脸的事。@EJP,我相信,好的设计意味着如果你有一个函数来创建一些东西,你需要有一个函数来删除你创建的东西,而不是依赖于操作系统特定的实现细节。WinSock包括BSD套接字函数,只是套接字不是Windows上的文件描述符,它们是内核对象,所以Windows中的套接字不能使用
close()
,因此需要一个单独的
closesocket()
函数来代替。@SergeyA我不知道你在说什么。BSD是一个操作系统,它重用了现有的
close()
函数,该函数已经关闭了文件FDs,也关闭了套接字FDs,在BSD中,套接字FDs是同类对象。十年后,Winsock出现了,并且不得不添加
closesocket()
,因为Windows套接字句柄与Windows文件句柄是/不是同一类型的东西。到底为什么是BSD的错,而且是可耻的?我的经验正好相反。有一次,我花了数周的时间追踪一个严重的资源泄漏事件;事实证明,发生泄漏是因为通过调用popen()创建的(文件*)句柄正在通过调用fclose()关闭(因为fclose()被记录为在您使用完(文件*)后关闭它的方式)——但是fclose()调用不起作用,因为实际上有一个单独的pclose()调用您必须使用,而这对于代码的作者来说并不明显。寓意:只有在编译时发现任何配对错误时,配对打开/关闭调用才有帮助。