close()和closesocket()是否可互换?

时间:2016-02-16 19:52:15

标签: c++ sockets networking winsock2

我在这里看到很多答案,说使用close()来销毁套接字,但我使用msdn的指南让我使用了closesocket()。我想知道是否存在差异以及是否有理由使用其中一种。

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

1 个答案:

答案 0 :(得分:14)

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

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

我觉得BSD套接字不包含socket函数的特定对应部分,这可以在任何地方使用,但我觉得很可耻。但这就是生命。

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