我最近看到了一些看起来像这样的代码(袜子当然是套接字对象):
sock.shutdown(socket.SHUT_RDWR)
sock.close()
在套接字上调用shutdown然后关闭它的目的是什么?如果有所不同,则此套接字用于非阻塞IO。
我最近看到了一些看起来像这样的代码(袜子当然是套接字对象):
sock.shutdown(socket.SHUT_RDWR)
sock.close()
在套接字上调用shutdown然后关闭它的目的是什么?如果有所不同,则此套接字用于非阻塞IO。
Answers:
调用close
和shutdown
对基础套接字有两种不同的影响。
首先要指出的是,套接字是基础操作系统中的资源,并且多个进程可以具有同一基础套接字的句柄。
您打电话的时候 close
它时,将句柄计数减一,如果句柄计数达到零,则套接字和关联的连接将通过正常的关闭过程(有效地将FIN / EOF发送到对等方)来释放套接字。
这里要注意的是,如果句柄计数没有达到零,因为另一个进程仍然具有套接字的句柄,则连接不会关闭并且套接字不会被释放。
另一方面,调用shutdown
读写会关闭基础连接,并向对等方发送FIN / EOF,而不管套接字有多少个进程。但是,它不会取消分配套接字,您仍然需要在事后调用close。
.shutdown()
并在下一行通话会很聪明.close()
吗?还是应该在两者之间有延迟?
在Socket Programming HOWTO(py2 / py3)中已经提到了
断开连接
严格来说,应该先
shutdown
在套接字上使用close
它。该shutdown
是在另一端的咨询到插座。根据您传递的参数,它可能表示“ 我不再发送了,但我仍会听 ”,或“ 我不在听,很好的摆脱!”。但是,大多数套接字库都习惯于程序员忽略使用此礼节,通常aclose
与相同shutdown(); close()
。因此,在大多数情况下,不需要显式关闭。...
close()
就足够了。Python文档应予以更正。
上面的代码难道不是错误的吗?
在shutdown调用之后直接执行close调用可能会使内核无论如何都丢弃所有传出缓冲区。
根据 http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable, 需要在关机和关机之间等待关闭,直到读取返回0。
有一些关闭的方式:http : //msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx。* nix是相似的。
Shutdown(1),强制套接字no发送更多数据
这在
1-缓冲液冲洗
2-奇怪的错误检测
3-安全防护
让我解释更多,当您将数据从A发送到B时,不保证将其发送到B,仅保证将其发送到A os缓冲区,然后缓冲区又将其发送到B os缓冲区。
因此,通过在A上调用shutdown(1),您将刷新A的缓冲区,如果缓冲区不为空,则会引发错误,即:尚未将数据发送到对等方
但是,这是不可挽回的,因此您可以在完全发送完所有数据之后,并确保至少在对等os缓冲区中执行此操作
shutdown()
:)