ホームページ >バックエンド開発 >PHPチュートリアル >専門家の皆さん、php のソケットに関する問題について教えてください。
専門家の皆さん、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 ソケット コードを貼り付けます:
<!-- 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>