我在这里看到很多答案都建议使用 close() 来销毁socket,但我所使用的来自msdn 的指南让我使用 closesocket()。我想知道两者之间是否有区别,以及使用其中一个或另一个的原因。
在这两种情况下,我都看到建议使用 shutdown(),所以都可以正常使用。
我在这里看到很多答案都建议使用 close() 来销毁socket,但我所使用的来自msdn 的指南让我使用 closesocket()。我想知道两者之间是否有区别,以及使用其中一个或另一个的原因。
在这两种情况下,我都看到建议使用 shutdown(),所以都可以正常使用。
close()
是*nix函数。它适用于任何文件描述符,而Unix中的套接字就是文件描述符的一种实例,因此它也可以正确地关闭套接字。
closesocket()
是Windows特定的函数,专门用于处理套接字。Windows上的套接字不使用*nix-style文件描述符,socket()
返回一个内核对象句柄,所以必须使用来关闭它。
我觉得挺遗憾的,BSD-sockets没有包含与socket
函数对应的特定函数,这样就可以在任何地方使用 - 但生活就是这样。
最后,不要将shutdown
套接字与关闭套接字混淆。 shutdown()
会停止套接字上的传输,但套接字仍然存在于系统中,与它相关联的所有资源也保持不变。在关闭套接字之前,您仍然需要将其关闭。
close()
函数,该函数已经关闭文件FD,也可以关闭套接字FD,在BSD中,套接字FD是相同类型的对象。十年后,Winsock出现了,因为Windows套接字句柄与Windows文件句柄不是同一种类型的东西,所以必须添加closesocket()
。那么,为什么这是BSD的错,而且可耻呢? - user207421
close()
是*nix系统下的函数;而closesocket()
则是Windows平台下的等效函数。 - Jonathan Potter