高手來,關於php中socket的問題!

來源:互聯網
上載者:User
一個硬體往伺服器連接埠上發送資料(抓包軟得到的是正確的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

  
可以完美解決你的問題。。。。。。剛看見這個你的問題
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.