首页 新闻 搜索 专区 学院

python socket recv()用了循环来接受,为什么还是接受不全

0
悬赏园豆:100 [已解决问题] 解决于 2019-04-11 16:07

如下图,先接收了包头,然后while循环根据拿到的包体长度recv数据。但是发现越往后执行,用len()取到的包体长度跟包头中得到的包体长度开始变得不一致了。求大神解答,网上的解决方案我都试的差不多了,没一个行得通。

bodySize: 6
recv接收的长度是: 298

输了怪队友的主页 输了怪队友 | 初学一级 | 园豆:114
提问于:2019-04-04 02:23
< >
分享
最佳答案
0

楼主自己解决了这个问题,其实recv(len)已经接受全了返回数据,但是楼主忽略了服务器主动推的数据(PS:游戏是用的长连接),所以后来解码的时候老是报错。
解决办法:对接受到的包头header_bytes[1]进行判断,如果等于我需要的GS2C,那么进行解码。

输了怪队友 | 初学一级 |园豆:114 | 2019-04-11 16:06
其他回答(1)
0

你说的应该是粘包问题。  recv是缓冲模式的读取,具体的长度需要你自己处理才行

收获园豆:100
2012 | 园豆:19317 (专家六级) | 2019-04-04 13:30

意思是我根据bodysize取的只是缓存里的数据,而缓存里是可能不止这一次请求返回的完整包,所以recv(8)那边就已经出问题了,可能取出的都不是包头,只是缓存里前8个数据而已?

支持(0) 反对(0) 输了怪队友 | 园豆:114 (初学一级) | 2019-04-04 13:42

@输了怪队友: 请问这个问题怎么解决呀?我recv(8)里边是文件大小,然后根据文件大小来接收数据,但每次recv(8)数据都不准确。能请教一下吗?搞了好几天都没弄好。。。

支持(0) 反对(0) 无敌豆豆豆、 | 园豆:200 (初学一级) | 2019-10-09 22:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册