【问题标题】:Are close() and closesocket() interchangable?close() 和 close socket() 可以互换吗?
【发布时间】:2016-05-28 06:41:04
【问题描述】:

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

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

【问题讨论】:

  • 你确定你没有把 linux (close()) 和 Windows (closesocket()) 搞混了吗?
  • 我相信close()是一个*nix函数; closesocket() 相当于 Windows。

标签: c++ sockets networking winsock2


【解决方案1】:

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

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

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

最后但并非最不重要的一点是,不要将shutdown'ing 套接字与关闭套接字混淆。 shutdown() 停止在套接字上的传输,但套接字仍保留在系统中,并且与其关联的所有资源都保留。关闭后仍需要关闭套接字。

【讨论】:

  • BSD 领先十年。他们无法预测未来,但这并没有什么可耻的。
  • @EJP,我相信,好的设计意味着如果你有一个创建东西的函数,你需要一个删除你创建的东西的函数,而不是依赖于特定于操作系统的实现细节。
  • WinSock 包含 BSD 套接字函数,只是套接字在 Windows 上不是文件描述符,它们是内核对象,所以 close() 不能用于 Windows 的套接字上,因此需要单独closesocket() 函数。
  • @SergeyA 我不知道你在说什么。 BSD一个操作系统,它重用了现有的close()函数,已经关闭了文件FD,也关闭了套接字FD,在BSD中是同类对象。十年后,Winsock 出现并不得不添加 closesocket(),因为 Windows 套接字句柄与 Windows 文件句柄是/不是同一种东西。为什么是那个 BSD 的错,而且是可耻的?
  • 我的经历正好相反。我曾经花了数周时间追踪一个令人讨厌的资源泄漏;事实证明,发生泄漏是因为通过调用 popen() 创建的 (FILE *) 句柄正在通过调用 fclose() 关闭(因为 fclose() 被记录为关闭 (FILE *) 时的方式你已经用完了)——但是 fclose() 调用不起作用,因为实际上你必须使用一个单独的 pclose() 调用来代替,这对代码的作者来说并不明显。寓意:只有在编译时发现任何配对错误时,配对的打开/关闭调用才有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2015-10-06
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多