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

Eni*_*gma 8 c++ sockets networking winsock2

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

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

Ser*_*eyA 14

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

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

我发现BSD套接字不包含socket功能的特定对应物,这可以在任何地方使用 - 但这就是生命,这是相当可耻的.

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

  • BSD 最早出现了十年。他们没能预知未来,但也没有什么可耻的。 (2认同)
  • @EJP,我相信,好的设计意味着如果您具有创建某些内容的功能,则需要具有删除所创建内容的功能,而不是依赖于特定于操作系统的实现细节。 (2认同)
  • @SergeyA 我不知道你在说什么。BSD * 是* 一个操作系统,它重用了已经关闭文件 FD 的现有 `close()` 函数来关闭套接字 FD,这在 BSD 中是同类对象。十年后,Winsock 出现并不得不添加 `closesocket()`,因为 Windows 套接字句柄与 Windows 文件句柄是/不是同一类东西。为什么那是 BSD 的错,而且是可耻的? (2认同)
  • 我的经历恰恰相反。我曾经花了数周时间来追踪令人讨厌的资源泄漏;事实证明,发生泄漏是因为通过调用fclose()关闭了通过调用popen()创建的(FILE *)句柄(因为当关闭时,已将fclose()记录为关闭(FILE *)的方式。您已经完成了使用)–但是fclose()调用无法正常工作,因为实际上您必须使用一个单独的pclose()调用,这对于代码作者而言并不明显。道德:配对打开/关闭调用仅在编译时发现任何配对错误时才有用。 (2认同)