Chinaunix首页 | 论坛 | 博客
  • 博客访问: 522726
  • 博文数量: 80
  • 博客积分: 1496
  • 博客等级: 上尉
  • 技术积分: 1292
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-18 11:24
个人简介

IT码农一个~

文章分类

全部博文(80)

文章存档

2020年(3)

2019年(7)

2017年(1)

2016年(2)

2015年(2)

2014年(26)

2013年(26)

2012年(2)

2011年(1)

2010年(1)

2008年(9)

我的朋友

分类: LINUX

2019-08-19 17:21:11

最近做新项目,遇到一个问题,

现象是人多了之后,客户端就有很大概率无法登录,或者进去之后过一段时间 就断线了,
客户端每次说是服务器给断线了。 但是服务器代码我确认了几次, 除了崩溃是不会主动断线的
加上客户端自己的电脑上,一直没有出现过这个问题,所以他也拖着不查

wireshark客户端抓包看的是 客户端一直在重复的发 ack ,找 服务器要包。。。
难道内网环境也会丢包?
我还一度怀疑是 服务器的erlang delay_send 参数的问题,关了之后,发现问题还在

服务器抓包,看的是其实包大小只有3.7k,已经发了,不过是分了两次发的(2920 + 786)

好不容易说服客户端去debug
客户端debug: 发现读的包头是一个巨大的数字 。。。他还怀疑是网络字节序的问题,
不过erlang的包头是erlang虚拟机加的,理论上应该不会出这种问题,而且sgame已经验证好几年了

无奈,只能在客户端收包的地方加断点debug,发现客户端包没收完,也会每次读的时候先读一个包头大小的长度
怀疑是客户端没有做分包的合并逻辑
    
最后发现:是客户端的拼包逻辑有问题(网上拷贝代码改的),某些地方是按4个字节读的,某些地方是按2个字节读的(没改全)
    然后不应该读包头的地方,去读了包头,就得到一个巨大的数字

表现就是客户端一直问服务器要数据,而服务器早已经发完了,就互相等待。

最终分析:这个问题只有在服务器下发的数据分包了,且客户端某次没有一次收全整个包体的时候才会出现。


服务器抓到的包:



阅读(693) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~