繁体   English   中英

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

[英]Python 2.7 TCP Sockets: socket.send() that returns zero versus socket.send() that raises socket.error exception?

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

如果套接字send或recv处理0个字节后返回,则说明连接已断开。

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

socket.error:[Errno 104]对等重置连接

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

获取RST是TCP协议中一个非常特定的用例-对等方通过在TCP报头中设置RST标志来发回一条消息。 这通常意味着对等方没有套接字端点。 如果远程对等方的计算机突然重新启动而没有机会正常关闭套接字(也就是使用4向FIN消息),则会发生这种情况。 一旦重新联机,它将丢失先前的套接字端点,并且如果它为较旧的连接接收到任何新的TCP数据包,则它将通过设置RST标志来发送TCP消息。

与接收RST相反,连接可能由于其他原因而关闭。 其中之一是正常使用FIN消息。 在这种情况下,TCP层的基础连接将关闭。 另一种情况可能是对等方的连接丢失,并且设置了TCP Keepalive选项。 对于这种情况,当对等方变为空闲状态时,TCP将发送保持活动探测,并且由于连接不存在,因此不会回复保持活动状态。 一旦TCP层未收到一组N个Keepalive,则它将在本地关闭连接。 在这样的套接字上调用Python的send和recv返回0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM