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

2021-10-12 02:08:37 +08:00
 just1

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

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

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

我的 Python 版本为 3.8

2606 次点击
所在节点    Python
11 条回复
dingwen07
2021-10-12 02:53:46 +08:00
我没有遇到过
不过我没试过 10 分钟的,之后试一下
jedihy
2021-10-12 03:29:59 +08:00
单步进去看看这个 0 是不是 winsock 的 recv()返回的。如果是,并且你还能收到新数据,那可能是 OS 的 bug 。不然可能是 python 的 bug 。
lzp729
2021-10-12 05:52:01 +08:00
超时了
skinny
2021-10-12 09:13:20 +08:00
问得没头没尾的,你代码怎么写的?
est
2021-10-12 09:40:59 +08:00
> 我依然可以接收到新的数据,也可以发送。

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

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

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

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

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

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

© 2021 V2EX