gpt4 book ai didi

Python 2.7 TCP 套接字 : socket. send() 返回零与 socket.send() 引发 socket.error 异常?

转载 作者:行者123 更新时间:2023-12-01 05:35:24 27 4
gpt4 key购买 nike

来自http://docs.python.org/2/howto/sockets.html

if a socket send or recv returns after handling 0 bytes, the connection has been broken.

另一方面,如果 TCP 连接的远程端关闭(或被终止),并且随后调用 socket.send(),则可以看到以下 socket.error 异常

socket.error: [Errno 104] Connection reset by peer

现在我的问题是,“连接已断开”和“连接被对等方重置”之间有什么区别。 “连接已断开”的确切含义是 == socket.send() 返回零。对我来说,无法发送哪怕一个字符就和 socket.error 异常一样糟糕。无论什么事件导致 socket.send 返回零,理想情况下都应该引发 socket.error 异常,以便应用程序不必处理两个不同的事情(异常和返回值零)。

最佳答案

获取 RST 是 TCP 协议(protocol)中一个非常具体的用例——对等方通过在 TCP header 中设置 RST 标志来发回消息。这通常意味着对等方没有套接字端点。如果远程对等方的计算机突然重新启动而没有机会正常关闭套接字(也称为使用 4 路 FIN 消息),则可能会发生这种情况。一旦它重新上线,它就丢失了早期的套接字端点,如果它收到旧连接的任何新 TCP 数据包,那么它将通过设置 RST 标志来发送 TCP 消息。

与接收 RST 不同,连接可能会由于其他原因而关闭。其中之一是正常优雅地使用 FIN 消息。在这种情况下,TCP 层的底层连接将被关闭。另一种情况可能是对等方的连接丢失,并且设置了 TCP Keepalive 选项。对于这种情况,当对等方空闲时,TCP 将发送保活探测,并且由于不存在连接,因此不会对保活进行回复。一旦TCP层没有收到一组N个keepalive,那么它将在本地关闭连接。在这样的套接字上调用Python的send和recv返回0。

关于Python 2.7 TCP 套接字 : socket. send() 返回零与 socket.send() 引发 socket.error 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19192345/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com