<?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
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答