在用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方法的检查呢,或者是通过检查后被什么截断了呢(我自己并没有写代码去截断消息)?
你好,请用新版本吧,老版本的问题不讨论了
呃。。系统上线了,怎么换。。
这是旧版本的BUG吗?
不是bug,是贴主协议没处理好。
strrchr的用法就不对
但是我将200字节不完整的消息放到函数中检查,发现是返回1的
“strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。”
这个函数用法为什么不对呢,我这样子判断消息的结尾为什么不行?
http://php.net/manual/zh/function.strrchr.php
注意看手册:
strrchr — 查找指定字符在字符串中的最后一次出现
查找指定字符,而不是查找指定字符串哦
哦哦,原来是这样,谢谢!!