您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

高手来,关于php中socket的问题!

2025/6/11 17:06:29发布23次查看
一个硬件往服务器端口上发送数据(抓包软得到的是正确的16进制),通过抓包软件抓取的数据是正常的(16进制),然而通过php的socket接受到的数据(通过转换后也是16进制,未转换是乱码),下面贴上代码,请高手帮忙看下哪里错了。为什么php的socket获取的数据和抓包软件获取的不一样
通过抓包软件获取的正确代码是(16进制的):fa 01 01 ff aa 03 00 01 00 0b 00 00 00 a3
通过php socket获得的数据(通过dechex(),ord()转换后的,和软件抓取的不一样,是错误的):fa 7 25 2 fa 2 0 9 f6 4 2c 88 fa 1
下面贴上php的socket代码:
= $max_users) { $reject = server full. try again later.\n; } //将当前客户端连接放如socket_select选择 $connections[$i] = $newconn; //输入的连接资源缓存容器 $writefds[$i] = $newconn; //连接不正常 if ($reject) { $close[$i] = true; } else { echo welcome to the php chat server!\n; } //初始化当前连接读取内容的缓存容器 $input[$i] = ; continue; } //客户端连接 $i = (int)$rfd; //读取 $tmp = @socket_read($rfd, 14, php_normal_read); if (!$tmp) { //读取不到内容 print connection closed on socket $i\n; close($i); continue; } $input[$i] .= $tmp; $tmp = substr($input[$i], -1); /*if ($tmp != \r && $tmp != \n) { // no end of line, more data coming continue; }*/ $line = trim($input[$i]); $input[$i] = ; echo 'client >>'.$line.\r\n; $data=str_split($line); print_r($data); echo \r\n; //$data = explode(\t,$line); //$data=str_split($data); foreach($data as $v){ echo dechex(ord($v)).\t; } echo \r\n; socket_getpeername($connections[$i],&$remoteip,&$remoteport);echo $remoteip.\r\n;echo $remoteport.\r\n;//$data=str_split($buffer);//print_r($data);$str=\xfa\x01\x01\xff\xaa\xaa\x00\x01\x00\x00\x00\x00\x00\x01; socket_send($connections[$i],$str,strlen($str),0); } foreach ($writefds as $wfd) { $i = (int)$wfd; $w = socket_write($wfd, hello); } } }function close($i){ global $connections, $input, $close; socket_shutdown($connections[$i]); socket_close($connections[$i]); unset($connections[$i]); unset($input[$i]); unset($close[$i]);}?>
回复讨论(解决方案) 完全模拟你的现场和代码
$str=\xfa\x01\x01\xff\xaa\xaa\x00\x01\x00\x00\x00\x00\x00\x01;$line = $str;$data = str_split($line);foreach($data as $v){ echo dechex(ord($v)).\t;}
得到
fa 1 1 ff aa aa 0 1 0 0 0 0 0 1
没看出有什么差别
完全模拟你的现场和代码
php code
$str=\xfa\x01\x01\xff\xaa\xaa\x00\x01\x00\x00\x00\x00\x00\x01;
$line = $str;
$data = str_split($line);
foreach($data as $v){
echo dechex(ord($v)).\t;
}
得到
f……
你这个模拟的是发给硬件的数据是正常的,我的需求是:硬件发的数据我用socket接受不正常,通过抓包工具得到的数据是正确的(fa 01 01 ff aa 03 00 01 00 0b 00 00 00 a3),而用socket得到的数据,在dos下是乱码,我通过dechex(ord(得到的数据))转换后是:fa 7 25 2 fa 2 0 9 f6 4 2c 88 fa 1(是错误的),我想得到的是和抓包工具得到的一样的数据(即:fa 01 01 ff aa 03 00 01 00 0b 00 00 00 a3)
你有 $line = trim($input[$i]); 这是接受到的数据吧?
1、去掉 trim,否则传入的数据可能会被截断
2、因为是二进制数据,你 echo base64_encode($input[$i]); 贴出结果
你有 $line = trim($input[$i]); 这是接受到的数据吧?
1、去掉 trim,否则传入的数据可能会被截断
2、因为是二进制数据,你 echo base64_encode($input[$i]); 贴出结果
+gclavocaan2bcyi+geb+v/6aqh/qqoaaqaaaaaaafobaf+qqgabaaaa
这是得到的数据
$s = base64_decode('+gclavocaan2bcyi+geb+v/6aqh/qqoaaqaaaaaaafobaf+qqgabaaaa');print_r(unpack('h*', $s));//或for($i=0; $i 你有 $line = trim($input[$i]); 这是接受到的数据吧?
1、去掉 trim,否则传入的数据可能会被截断
2、因为是二进制数据,你 echo base64_encode($input[$i]); 贴出结果
下图是通过抓包工具抓取的数据(正确的数据),图中圈住阴影部分的16进制的数据如何转换成箭头所指的数据,以及如何再转回到16进制
[img=http://bbs.php100.com/attachment/mon_1208/18_219521_355456b7c8c862b.jpg?93][/img]
你收到的就是二进制数据,要转来转去干什么?
你红线框住的那些,是数据的十六进制表示。
一个字节是8个二进制位,1个十六进制数是4个二进制位
2个十六进制数正好表示一个字节的内容。
我现在用php socket收到的数据是箭头所指的数据(并且放在变量$a中),我现在想将她转换成图中圈中阴影部分的数据(也就是16进制),改如何转换呢?
你收到的就是二进制数据,要转来转去干什么?
你红线框住的那些,是数据的十六进制表示。
一个字节是8个二进制位,1个十六进制数是4个二进制位
2个十六进制数正好表示一个字节的内容。
我现在用php socket收到的数据是箭头所指的数据(并且放在变量$a中),我现在想将她转换成图中圈中阴影部分的数据(也就是16进制),改如何转换呢?
我 #6 不是给你代码了吗?
说的感觉有点乱,不好意思
是否有转义符?
我 #6 不是给你代码了吗?
现在的确是可以获取到代码了,但是少了3个16进制的数据
获取到的代码是:fa072502fa020009f6042c88fa0101fafffa0101ffaa030001000b00
抓包得到的是:fa 01 01 ff aa 03 00 01 00 0b 00 00 00 a3
也就是少了 00 00 a3
可以完美解决你的问题。。。。。。刚看见这个你的问题
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product