|
要点是 pack 和 unpack 函数
Erlang使用{packet,N}后,会自动在数据前面增加N为 16进制数据,代表接下来的数据长度
AS里面也有类似功能
PHP没有直接的方法,需要自己封装包头信息,和解包
(感谢 mryufeng 的提示,将fgets 改成 fread)
<?php
$host ="114.80.88.*";
$port =5101;
$fp = stream_socket_client("tcp://$host:$port", $errno, $errstr, 2);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
stream_set_timeout($fp,2);
get_line($fp);
put_line($fp,"SYSMSG,bobo,Hi boy");
fclose($fp);
}
function get_line($handle){
while(!feof($handle)){
$buff =fread($handle,2); //获得长度信息
$head =unpack("H*",$buff);
return fread($handle,hexdec($head[1]));
}
}
function put_line($handle,$data){
$body=pack("A*",$data); //将数据打包
$len=strlen($body);
$head=pack("H*",to_hex_str($len));
fwrite($handle,$head.$body);
}
function to_hex_str($num){ //将十进制长度转换成16进制,并且补0
$str =dechex($num);
$str =str_repeat('0',4-strlen($str)).$str;
return $str;
}
?> |
|
|