未结束的消息也通过了检查

wudihzh

在用Workerman 2.x的版本,发现这样一个问题:
我们的协议是类似!abc#222#abc!(协议里本来用的是星号,因为预览里不能显示星号,这里用!替换了星号)这样的格式,在onGatewayMessage函数中,检查消息是否完整的函数是这样子的:

public static function check($buffer)
    {
        if (strrchr($buffer, '#abc!') === '#abc!') {
            return 0;
        }
        return 1;
    }

在onMessage函数中打印接收的消息,发现当消息小于200字节时,是完整的,即有消息结束标记,但是当消息内容大于200字节时,打印出的消息却是不完整的(刚好200字节,结束标记不见了),那么这样的消息为什么能通过check方法的检查呢,或者是通过检查后被什么截断了呢(我自己并没有写代码去截断消息)?

阅读 1599
5个回答

walkor

你好,请用新版本吧,老版本的问题不讨论了

  • wudihzh 2015-10-23

    呃。。系统上线了,怎么换。。

wudihzh

这是旧版本的BUG吗?

  • 暂无评论
walkor

不是bug,是贴主协议没处理好。
strrchr的用法就不对

  • wudihzh 2015-10-25

    但是我将200字节不完整的消息放到函数中检查,发现是返回1的

wudihzh

“strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。”
这个函数用法为什么不对呢,我这样子判断消息的结尾为什么不行?

  • 暂无评论
walkor

http://php.net/manual/zh/function.strrchr.php
注意看手册:
strrchr — 查找指定字符在字符串中的最后一次出现

查找指定字符,而不是查找指定字符串哦

  • wudihzh 2015-10-25

    哦哦,原来是这样,谢谢!!