首页 >后端开发 >php教程 >高手来,关于php中socket的有关问题

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

WBOY
WBOY原创
2016-06-13 10:51:28881浏览

高手来,关于php中socket的问题!
一个硬件往服务器端口上发送数据(抓包软得到的是正确的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代码:

PHP code
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?phperror_reporting(E_ALL);set_time_limit(0);ini_set("allow_call_time_pass_reference",true);//监听端口$PORT = 8888;//最大连接池$MAX_USERS = 50000;//创建监听端口//$sock = socket_create_listen($PORT);$commonProtocol = getprotobyname("tcp");$sock = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);@socket_bind($sock, '192.168.1.101', 8888);@socket_listen($sock);if (!$sock){    exit(1);}//不阻塞socket_set_nonblock($sock);$connections = array();$input = array();$close = array();while (true){    //sleep(3);    $readfds = array_merge($connections, array($sock));    $writefds = array();    //选择一个连接,获取读、写连接通道    if (socket_select($readfds, $writefds, $e = null, $t=60))    {        foreach ($readfds as $rfd)        {            //如果是当前服务端的监听连接            if ($rfd == $sock)            {                //接受客户端连接                $newconn = socket_accept($sock);                $i = (int)$newconn;                $reject = '';                if (count($connections) >= $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 $in";                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."rn";                                                $data=str_split($line);  print_r($data); echo "rn";                        //$data = explode("t",$line);            //$data=str_split($data);            foreach($data as $v){             echo dechex(ord($v))."t";                          }             echo "rn";                                                            socket_getpeername($connections[$i],&$remoteIP,&$remotePort);echo $remoteIP."rn";echo $remotePort."rn";//$data=str_split($buffer);//print_r($data);$str="xFAx01x01xFFxAAxAAx00x01x00x00x00x00x00x01"; 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]);}?><div class="clear"></div>
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn