一个关于luasocket使用的很蠢的问题

今天遇到了一个问题,服务端给客户端发包,偶尔会出现客户端无法解析的情况。我们服务端采用的skynet,客户端使用的是luasocket,协议采用的sproto。

照例首先不怀疑库的问题,肯定是自己的原因,而且应该是比较蠢的问题。首先问题出现在某一个协议上,这个协议每次发出去,客户端都无法解析,然而从proto文件里无法看出任何差别,也尝试修改了其他几个协议来尝试,并没有发现使其必现的规律,折腾了半天。最后只好动用VS,单步调试,内存跟踪,最终发现一个问题,服务端发出的包内容和客户端收到后拿给sproto解析的包内容不一致!

继续跟踪,发现luasocket最初拿到的原始数据是跟服务端发出来的是一致的,但是最终返回出来塞到lua里的值却是不正确的!如下图

QQ图片20150630000620
这个是从socket拿到的原始数据,跟服务端发出来的是一致的

QQ图片20150630000635
这个是返回出来给lua使用的,明显看出来有个数据被更改了!(这里说明下,sproto是将数据编码后又进行了一次压缩,详细可见这里,然后这个0d就是整个包的长度,但是却被当做’\r’给忽视掉了,因为都是13 = =!)

QQ图片20150630000640,

于是最终原因发现了,原来是调用luasocket的recevie时使用的recvline 而不是recvall,它们通过转义符 ‘*l’ 和 ‘*a’来区分。于是将转义符改为’*a’,问题解决,实在是有够蠢的……………………

发表评论

电子邮件地址不会被公开。