ホームページ >バックエンド開発 >PHPチュートリアル >専門家の皆さん、php のソケットに関する問題について教えてください。

専門家の皆さん、php のソケットに関する問題について教えてください。

WBOY
WBOYオリジナル
2016-06-13 13:11:15815ブラウズ

専門家の皆さん、php のソケットの問題について教えてください。
ハードウェアがサーバー ポートにデータを送信し (パケット キャプチャ ソフトウェアは正しい 16 進数を取得します)、パケット キャプチャ ソフトウェアによってキャプチャされたデータは正常です (16 進数)。 ) ) ただし、php ソケットを介して受信したデータ (変換後も 16 進数であり、変換しないと文字化けします)、コードを以下に貼り付けます。専門家が問題を見つけるのを手伝ってください。 PHP ソケットで取得したデータとパケット キャプチャ ソフトウェアで取得したデータが異なるのはなぜですか?

パケット キャプチャ ソフトウェアで取得した正しいコードは (16 進数): FA 01 01 FF AA 03 00 01 00 0B 00 00 00 A3
php ソケットを通じて取得されたデータ (dechex()、ord() を通じて変換され、ソフトウェアがキャプチャしたものとは異なり、間違っています): fa 7 25 2 fa 2 0 9 f6 4 2c 88 fa 1

以下の PHP ソケット コードを貼り付けます:

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
<?php
エラー報告(E_ALL);
set_time_limit(0);
ini_set("allow_call_time_pass_reference",true);

// リスニングポート
$ポート = 8888;
//最大接続プール
$MAX_USERS = 50000;
//リスニングポートを作成
//$sock = ソケット作成_リッスン($PORT);


$commonProtocol = getprotobyname("tcp");
$sock =socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
@socket_bind($sock, '192.168.1.101', 8888);
@socket_listen($sock);




if (!$靴下)
{
    終了(1);
}
//ブロックしないでください
ソケットセット_ノンブロック($sock);

$connections = array();
$input = 配列();
$close = 配列();

その間(真)
{
    //スリープ(3);
    $readfds = array_merge($connections, array($sock));
    $writefds = 配列();

    //接続を選択し、読み取りおよび書き込み接続チャネルを取得します
    if (socket_select($readfds, $writefds, $e = null, $t=60))
    {
        foreach ($readfds を $rfd として)
        {
            // 現在のサーバーのリスニング接続の場合
            if ($rfd == $sock)
            {
                //クライアント接続を受け入れる
                $newconn = ソケット受け入れ($sock);
                $i = (int)$newconn;
                $reject = '';
                if (count($connections) >= $MAX_USERS)
                {
                    $reject = "サーバーがいっぱいです。後でもう一度お試しください。n";
                }
                //現在のクライアント接続をsocket_select選択として配置します
                $connections[$i] = $newconn;
                //入力接続リソースキャッシュコンテナ
                $writefds[$i] = $newconn;
                //接続が異常です
                if($拒否)
                {
                    $close[$i] = true;
                }
                それ以外
                {
                    echo "PHP チャット サーバーへようこそ!n";
                }
                //現在の接続からコンテンツを読み取るためにキャッシュ コンテナを初期化します
                $input[$i] = "";
                続く;
            }
            //クライアント接続
            $i = (int)$rfd;
            //読む
            $tmp = @socket_read($rfd, 14, PHP_NORMAL_READ);
            if (!$tmp)
            {
                //コンテンツを読み取れません
                print "ソケット $in で接続が閉じられました";
                閉じる($i);
                続く;
            }
            $input[$i] .= $tmp;
            $tmp = substr($input[$i], -1);
            /*if ($tmp != "r" && $tmp != "n")
            {
                // 行末がないため、さらにデータが来ます
                続く;
            }*/
            $line = トリム($input[$i]);
            $input[$i] = "";
            echo 'クライアント >>'.$line."rn";
            
            
            
            $data=str_split($line);
 
 print_r($data);
 「rn」をエコーし​​ます。
            
            //$data =explode("t",$line);
            //$data=str_split($data);
            foreach($data as $v){
             echo dechex(ord($v))."t";
             
             }
             「rn」をエコーし​​ます。
            
            
            
            
            ソケット_getpeername($connections[$i],&$remoteIP,&$remotePort);
echo $remoteIP."rn";
echo $remotePort."rn";
//$data=str_split($buffer);
//print_r($data);
$str="xFAx01x01xFFxAAxAAx00x01x00x00x00x00x00x01";
 ソケット送信($connections[$i],$str,strlen($str),0);
            
            
            
            
            
            
        }
        foreach ($writefds を $wfd)
        {
            $i = (int)$wfd;
            $w = ソケット書き込み($wfd, "こんにちは");
        }
    }
}

関数クローズ($i)
{
    グローバル $connections、$input、$close;
    ソケットシャットダウン($connections[$i]);
    ソケットクローズ($connections[$i]);
    unset($connections[$i]);
    unset($input[$i]);
    unset($close[$i]);
}
?>

 <div class="clear"></div>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。