定制协议错误数据清理问题

深爱迷惘

我自定义了一套协议,采用的TCP传输方式,协议主要作用是判断数据完整及有效性并进行初步处理转换成一个对象提交到ONMESSAGE里面去处理.

现在有一个问题,当我在INPUT里面判断出来BUFFER里面的数据帧头是错误的,不符合我的协议规范要求,这时我需要将BUFFER清空并返回0,表示清空缓冲区,不调用DECODE并等待下一帧数据的到达.

测试直接设置BUFFER=NULL无效,下一帧数据到达时会加上之前错误的数据,如果RETURN整个数据的长度又会触发DECODE及ONMESSAGE,这样我需要在后面两个回调里面再次去判断有效性,有点浪费资源.我希望数据到DECODE就已经是有保证的有效性的数据,不知道这个有什么好的解决办法?

3118 3 1
3个回答

wangzhibin

if(数据非法) return;

这样直接return即可

  • 暂无评论
深爱迷惘

谢谢你的解答,我先进一步测试一下,非常感谢1

  • 暂无评论
walkor

调用$connection->consumeRecvBuffer($length)来清空接收缓冲区的数据,$length代表清空多少字节。
然后input里面return 0即可。

建议:
建议收到无效数据最好把链接断开,不能容忍客户端的数据错误。
将buffer清空不一定保证下一个正确的包能被解析。因为清空的数据里面可能包含了下一个正确包的包头部分,造成下一个包解析时也出现错误,如此恶性循环,可能导致这个链接上发来的数据都是无法解析的。

  • 暂无评论
年代过于久远,无法发表回答
🔝