为什么 Python 在 Windows 系统下 socket(blocking) recv 会得到长度为 0 的空数据

2021 年 10 月 12 日
 just1

网上查找都是说 recv 为空代表对等方已经关闭了连接,但事实上并没有关闭?我依然可以接收到新的数据,也可以发送。

https://stackoverflow.com/questions/3091010/recv-socket-function-returning-data-with-length-as-0

并且同样的代码在 linux 下就很正常,这个情况只在 Windows 下复现。并且非常神奇,socket 刚创建没问题,10 分钟后(一秒不差)就出现 recv 空数据

我的 Python 版本为 3.8

3425 次点击
所在节点    Python
11 条回复
dingwen07
2021 年 10 月 12 日
我没有遇到过
不过我没试过 10 分钟的,之后试一下
jedihy
2021 年 10 月 12 日
单步进去看看这个 0 是不是 winsock 的 recv()返回的。如果是,并且你还能收到新数据,那可能是 OS 的 bug 。不然可能是 python 的 bug 。
lzp729
2021 年 10 月 12 日
超时了
skinny
2021 年 10 月 12 日
问得没头没尾的,你代码怎么写的?
est
2021 年 10 月 12 日
> 我依然可以接收到新的数据,也可以发送。

不代表连接没关闭。。。。

你发送,对方可以不收。。并且对方再通知你,不要联系了。
makelove
2021 年 10 月 12 日
这种不应该贴一下最小复现代码吗
dreamtrail
2021 年 10 月 12 日
也许是系统或者 python 有 bug,但这种可能性挺小的
muzuiget
2021 年 10 月 12 日
只是缓冲区没有数据而已,返回负数才是错误啊,比如连接关闭,再 recv 多几次就应该出现负数了。
muzuiget
2021 年 10 月 12 日
晕,原来是 Python,但是你贴的爆栈帖子说的是 C,两者语义未必一直,还是看 Python 文档好了。
just1
2021 年 10 月 12 日
@muzuiget 按照理解,blocking 下应该不会返回空数据才是
Shatyuka
2021 年 10 月 13 日
长连接 keepalive

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/807188

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX