自定义协议input()接收报文返回给decode时 return卡住

chenStudy

bug描述

自定义协议在input方法里面接收客户端传入报文,随后return给 decode()方法时卡住了,要过几分钟才往下执行业务代码,有谁知道是什么原因导致嘛

程序代码或配置

 public
    static function input($recv_buffer, ConnectionInterface $connection)
    {

        $tempdata = bin2hex($recv_buffer);
        echo "=========================收到上报数据==================== ";
        $stateStr = substr($tempdata, 0, 4);
        if(strcasecmp($stateStr, "7d7d") == 0){
            $pos = strpos($recv_buffer, "0752");
            if ($pos === false) {
                return 0;
            }
            // 在这里程序会卡住不往下执行
             return $pos;

        }
        return false;

期待的结果及实际结果

期望接着往后执行

系统环境及workerman/webman等具体版本

Workerman version:3.5.31
PHP version:7.3.32
截图
接收到报文后不往下执行decode()方法,求解

579 1 0
1个回答

six

input 里打印下 $tempdata ,可能数据不全。
input里每个返回值都打印下,看下返回的什么,是不是返回的0 或者 false

  • chenStudy 2023-01-06

    返回的是7d7d00000001000016001c010c05daff3238394650512154170756312e302e30300000000000000752这一串然后就卡住了

  • six 2023-01-06

    input写的不对,架设完整的数据长度为41个字节,应该返回41。但是你调用bin2hex()后数据变成82个字节,然后你`$pos = strpos($recv_buffer, "0752");返回长度$pos值为78,是错误的值。你应该返回 ($pos + 4)/2;是真实的长度。

  • six 2023-01-06

    返回的长度是78,但实际长度是41,数据收不全,所以一直无法调用decode了

  • chenStudy 2023-01-06

    我去还真是,难怪我在win系统上面用工具测试是可以的,因为用工具直接发送的就是上面这种明文,用设备去调试发送的是ASCII格式要转换成16进制,非常感谢,谢谢谢谢

年代过于久远,无法发表回答
🔝