首页 > 编程 > PHP > 正文

php socket编程-网络字节序,大端序-workerman

2020-03-22 18:30:04
字体:
来源:转载
供稿:网友
1.

<?php//网络字节序是指大端序,TCP/IP都是采用网络字节序的方式。//======================================================================================================////n -- 无符号短整数 (16位, 大端字节序)$str = 'test.string';$pack = pack('n', strlen($str));echo strlen($pack); // 2个字节,此值是确定的$unpack = unpack('nLen', $pack); // Len相当于定义的一个变量,返回值为打包时的长度echo $unpack['Len'];  // 等于strlen($str) 11个字节//exit;//======================================================================================================////N -- 无符号长整数 (32位, 大端字节序)$str = 'test.string';$pack = pack('N', strlen($str));echo strlen($pack); // 4个字节,此值是确定的$unpack = unpack('NLen', $pack); // Len相当于定义的一个变量,返回值为打包时的长度echo $unpack['Len'];  // 等于strlen($str) 11个字节exit;//======================================================================================================////如果提供socket服务方定义的//请求边界标识的长度为2,则用unsigned 16位的 ‘n’//请求边界标识的长度为4,则用unsigned 32位的 ‘N’//那么整个包体为 【网络字节序】+数据包实体,附加发送的长度参数为:【数据包实体长度+网络字节序长度】$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);$connect = socket_connect($socket, '192.168.1.10', 55660);$buffer = '我是数据包实体';$length = strlen($buffer);$pack = pack("N", $length + 4);socket_write($socket, $pack.$buffer, $length + 4);//同样unpack出来的lenght也是等于strlen($buffer)+4//那么socket_read之后的返回数据包就需要去掉4个长度就可以了


2.

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);$conn = socket_connect($socket, '192.168.1.10', 55660);$buffer = 'test.string';$len = strlen($buffer);echo 'buffter length: '.$len.'';$pack = pack('n', $len + 2);$send = socket_write($socket, $pack.$buffer, $len + 2);if($send){echo 'send ok';}$read = socket_read($socket, 10240);echo 'read data:'.$read .'';echo 'read length:'.strlen($read).'';echo 'real data is:'.substr($read, 2);

3.

<?phphtml' target='_blank'>class AndyHua extends Man/Core/SocketWorker{    public function dealInput($recv){        //目前已经收到的长度$len = strlen($recv);//preread_length = 2if($len < 2){return 2 - $len;}$t = unpack('nLen', $recv);//Len为包的实际长度return $t['Len'] - $len; //如果$t['Len']等于$len那就说明已经接收完了    }    public function dealProcess($recv){return $this->sendToClient($recv);//return $this->sendToClient(substr($recv, 2));    }}

4. [图片] QQ截图20141114144433.png

14144448_bV1G.png

5. [图片] QQ截图20141114144329.png

14144448_aBLY.png

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表