关于16进制数据传输无法获取问题

mliev

测试一:
 
操作系统:centos7 
PHP版本:5.6、7.0.12、7.0.33、7.3.0
 
现象:发送的字符串一旦ASCII编码超过127(十进制)就无法接收。
 
截图:
 [attach]1575[/attach]
 
 
测试二:
 
操作系统:Windows10 
PHP版本:7.0.33
 
现象:收发正常
 
截图:
 
[attach]1574[/attach]

2623 16 0
16个回答

walkor

截图下linux系统下workerman启动界面

  • 暂无评论
mliev

[attach]1577[/attach]
 

  • 暂无评论
walkor

你连的是哪个地址?

  • mliev 2018-12-21

    Internet of Things Services tcp://0.0.0.0:8052

walkor

截图下代码,看下在哪里打印的
 

  • 暂无评论
mliev
    /**

     *当客户端通过连接发来数据时(Workerman收到数据时)触发的回调函数

     * @param $connection 连接对象

     * @param $data 客户端连接上发来的数据

     */

    public function onMessage($connection,$data)

    {

        $a = bin2hex($data);

        echo "\n".$data."\n";

        echo $a."\n";

        //$connection->send(json_encode($data));

    }
  • 暂无评论
mliev

有必要说明一下,swoole也存在同样的问题。

  • 暂无评论
walkor

到服务器上抓包看下数据发过来没
tcpdump -Ans 4096 -iany port 8052

  • mliev 2018-12-21

    每次发送看到服务器是收到了,但是Workerman 没收到,见下面截图

mliev

[attach]1578[/attach]
 

  • 暂无评论
walkor

再启动个终端,运行 ps aux | grep 8052

  • 暂无评论
mliev

貌似是服务器没收到
我看到每次发送服务器显示length 0

  • 暂无评论
mliev

[attach]1579[/attach]
 

  • 暂无评论
walkor

把进程数改成1,然后重启。
运行ps aux | grep 8052 找到进程的pid
运行strace -ttp pid
然后请求看下strace结果
 
发送其它数据的时候linux下可以收到嘛?

  • 暂无评论
mliev

 
显示收到了
[attach]1580[/attach]
 

[attach]1581[/attach]
 

  • 暂无评论
walkor

lsof -nPp pid
截图下结果

  • 暂无评论
mliev

[attach]1582[/attach]
 

  • 暂无评论
walkor

看起来没有问题,strace结果也看到有数据输出到终端上。如果终端上看不到可能是终端环境问题,你可以尝试将数据写到文件里看下是否收到。 写入文件的时候使用绝对路径

  • mliev 2018-12-21

    谢谢的确收到了,问题解决了,只要直接将16进制数据不转码显示,编码超过127(ASCII扩展字符集)控制台直接将所有打印数据重定向到null里面去了。

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