我最近看到了一些类似这样的代码(当然,sock是一个套接字对象):
sock.shutdown(socket.SHUT_RDWR)
sock.close()在套接字上调用shutdown然后关闭它的目的到底是什么?如果有所不同,则此套接字用于非阻塞IO。
发布于 2009-01-03 21:10:08
这里有一个explanation
一旦不再需要套接字,调用程序就可以通过对套接字描述符应用Close子例程来丢弃该套接字。如果发生关闭时可靠传递套接字具有与其关联的数据,系统将继续尝试数据传输。但是,如果数据仍未传递,系统将丢弃该数据。如果应用程序不使用任何挂起的数据,它可以在关闭套接字之前使用套接字上的shutdown子例程。
发布于 2009-02-28 21:58:06
调用close和shutdown对底层套接字有两种不同的影响。
首先要指出的是,套接字是底层OS中的一种资源,多个进程可以拥有同一底层套接字的句柄。
当您调用close时,它会将句柄计数减1,如果句柄计数已达到0,则套接字和相关连接将经历正常的关闭过程(有效地向对等设备发送FIN / EOF ),并释放套接字。
这里要注意的是,如果句柄计数没有达到零,因为另一个进程仍然拥有套接字的句柄,则连接不会关闭,套接字也不会被释放。
另一方面,调用shutdown进行读写会关闭底层连接,并向对等体发送FIN / EOF,而不管有多少进程拥有套接字的句柄。但是,它关闭不释放套接字,并且您仍然需要在之后调用。
发布于 2009-01-04 01:28:30
shutdown和close的说明:Graceful shutdown (msdn)
Shutdown (在您的情况下)向连接的另一端指示不再打算从套接字读取或写入套接字。然后,close释放与套接字关联的所有内存。
忽略关闭可能会导致套接字在OSs堆栈中逗留,直到连接正常关闭。
在我看来,“关闭”和“关闭”这两个名称具有误导性,“关闭”和“销毁”会强调它们之间的区别。
https://stackoverflow.com/questions/409783
复制相似问题