【发布时间】:2013-05-20 16:06:34
【问题描述】:
基本上,我在几个地方读到socket.recv() 将返回它可以读取的任何内容,或者一个表明对方已关闭的空字符串(官方文档甚至没有提到连接时返回的内容已关闭...太好了!)。对于阻塞套接字来说,这一切都很好而且很花哨,因为我们知道recv() 只在实际有东西要接收时才返回,所以当它返回一个空字符串时,它必须表示另一端已经关闭连接,对吧?
好的,好的,但是当我的套接字非阻塞时会发生什么?我已经搜索了一下(可能还不够,谁知道?)并且无法弄清楚如何判断对方何时使用非阻塞套接字关闭了连接。似乎没有任何方法或属性可以告诉我们这一点,将recv() 的返回值与空字符串进行比较似乎完全没用……难道只有我有这个问题吗?
作为一个简单的例子,假设我的套接字超时设置为 1.2342342(您喜欢这里的任何非负数)秒,我调用socket.recv(1024),但在这 1.2342342 秒期间,另一端没有发送任何内容。 recv() 调用将返回一个空字符串,我不知道连接是否仍然存在......
【问题讨论】:
-
"(官方文档甚至没有提到连接关闭时返回的内容......太好了!)"。七年过去了,还是没有修好。这太令人沮丧了,花了将近一个小时试图弄清楚为什么我的套接字在连接关闭时没有引发错误。然后我就像好的让我们设置一个超时。这也没有引发异常,我真的很困惑。感谢您的帖子,否则我仍然会尝试解决这个问题。
-
这个问题在 Python 3 中仍然存在吗?我认为 OP 很可能在 Python 2 中遇到过这个问题,因为这个问题是在 2013 年提出的。
-
2021 年版,python 3 文档仍然没有真正提供对损坏或断开连接的返回值的清晰描述。尽管示例代码确实将 b'' 作为逻辑比较。感谢您的提问! (和答案):) docs.python.org/3/library/socket.html
标签: python sockets nonblocking recv