最近做新项目,遇到一个问题,
现象是人多了之后,客户端就有很大概率无法登录,或者进去之后过一段时间 就断线了,
客户端每次说是服务器给断线了。 但是服务器代码我确认了几次, 除了崩溃是不会主动断线的
加上客户端自己的电脑上,一直没有出现过这个问题,所以他也拖着不查
wireshark客户端抓包看的是 客户端一直在重复的发 ack ,找 服务器要包。。。
难道内网环境也会丢包?
我还一度怀疑是 服务器的erlang delay_send 参数的问题,关了之后,发现问题还在
服务器抓包,看的是其实包大小只有3.7k,已经发了,不过是分了两次发的(2920 + 786)
好不容易说服客户端去debug
客户端debug: 发现读的包头是一个巨大的数字 。。。他还怀疑是网络字节序的问题,
不过erlang的包头是erlang虚拟机加的,理论上应该不会出这种问题,而且sgame已经验证好几年了
无奈,只能在客户端收包的地方加断点debug,发现客户端包没收完,也会每次读的时候先读一个包头大小的长度
怀疑是客户端没有做分包的合并逻辑
最后发现:是客户端的拼包逻辑有问题(网上拷贝代码改的),某些地方是按4个字节读的,某些地方是按2个字节读的(没改全)
然后不应该读包头的地方,去读了包头,就得到一个巨大的数字
表现就是客户端一直问服务器要数据,而服务器早已经发完了,就互相等待。
最终分析:这个问题只有在服务器下发的数据分包了,且客户端某次没有一次收全整个包体的时候才会出现。
服务器抓到的包: