ホームページ >バックエンド開発 >PHPチュートリアル >PHPソケットがデータフローを処理できない、その対処方法(ブロックされているようです)

PHPソケットがデータフローを処理できない、その対処方法(ブロックされているようです)

WBOY
WBOYオリジナル
2016-06-13 12:22:301005ブラウズ

php ソケットがデータ フローを処理できません、その回避方法 (ブロックされているようです)
php ソケットがデータ フローを処理できません、それに対処する方法 (ブロックされているようです)
要件: PHP は、ハードウェアがポート 8888 にデータを送信すると、socket_send 関数は「xFAx01x01xFFxAAxAAx00x01x00x00x00x00x00x01」を返すはずですが、ハードウェアが 1 つあれば問題は発生しません。ただし、複数のハードウェアが同時に接続されている場合、同時にデータを送信すると、ハードウェアが応答し続けることができない(つまり、「ビープ」音が鳴る)状況が発生します。 、「ビープ音」が鳴り続けた後、数秒後に再び反応し始めます。いくつかの接続上のハードウェアは次のようになります。ノンブロッキングモードを使用しましたが、依然として発生します。解決策を探している場合、コードを以下に掲載します

PHP コード
<?phperror_reporting(E_ALL);set_time_limit(0);ini_set("allow_call_time_pass_reference",true);//监听端口$PORT = 8888;//最大连接池$MAX_USERS = 50;//创建监听端口//$sock = socket_create_listen($PORT);$commonProtocol = getprotobyname("tcp");$sock = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);@socket_bind($sock, '192.168.1.112@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 $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";                                                            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]);}?>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:PHPの裏技方法次の記事:PHPの裏技方法