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

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.<?php

class AndyHua extends Man\Core\SocketWorker{

public function dealInput($recv){

//目前已经收到的长度

$len = strlen($recv);

//preread_length = 2

if($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

php-sourcecode-48972.html

be3baafe17bc7ca4f7b5f26ffa77a099.png

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

php-sourcecode-48972.html

ec7cf919eb9752bd30f95778989df01f.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值