2

最近、PHPでソケットの練習を始めましたが、ドキュメントが見つからない問題が発生しました。私がC++で見たのと同様のケースですが、これに対する明確な答えはありません。コード:

do {
    $input = socket_read($client, 12,PHP_BINARY_READ);
    echo $input;
} while(TRUE);

ソケットでブロックし(作成、バインドなどのコードは含まれていません)、12バイトまたは反対側から入手可能な情報を取得することになっています。

奇妙なことに、12バイトが読み取られた場合、変数$inputに「1」が含まれます。クライアント側から12バイトを超えて送信すると、$inputの値で「1[REST_OF_DATA]」を受け取ります。

なぜこれが起こっているのか考えていますか?

これをより多くのデータとPHP_NORMAL_READに変更すると、データを正しく受信します。

オンラインのPHPマニュアルには、socket_readが「1」を返すことについては何も書かれていません。

**編集:早い段階で回答していただきありがとうございます:)。私はファイルに保存していて、文字を期待して読んでいます(ブラウザにエコーしません)。C++ソケットの知識を持っている人が検証できれば良いかもしれない何かを発見したかもしれないと思います。とにかく、私の読んだコードは実際にはこれでした(私が上に投稿したものではありません):

do {
    $input = ($seq_id == 0) ? socket_read($client, 12,PHP_BINARY_READ) : socket_read($client,1024,PHP_BINARY_READ);
    echo $input;
} while(TRUE);

私は最初の読み取りで12バイト、次に1024のチャンクを期待していました。これは、その条件チェックの理由です。奇妙な「1」はこれから来ています。これを上に投稿した行に置き換えると、データは正常に読み取られます。実際、このように読んでも:

$input = ($seq_ID == 0) ? socket_read($client,12,PHP_BINARY_READ) : socket_read($client, 12,PHP_BINARY_READ);

結果:1回目の読み取り= '1' 2回目の読み取り=正しいデータ、3回目の読み取り=正しいデータ。

4

2 に答える 2

1

指定するの12は読み取る最大長であるため12、0〜12文字のサイズの戻り文字列を意味する場合があります(PHPのバイナリ文字列、1文字= 1バイト)。

さらに、それはバイナリである可能性があるためvar_dump、返される文字列値のhexdumpを使用して、返されるバイト数を実際に確認することをお勧めします。echoは一部の制御文字を非表示にし、ブラウザは空白を非表示にする場合があります。

于 2012-04-09T16:24:09.947 に答える
0

上記のコメントの場合、はい$seq_idは増分する必要があります。コードを短くしたかっただけです。だから今、答えは私にとってもう重要ではありませんが、謎のままです。今月私のUbuntuバージョンをアップグレードした後、同じスクリプトでエラーを再現することができませんでした:

<?php
set_time_limit(0);
$address = "192.168.1.1";
$port = 3320;
$server_users = 3; 
$mysock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");
$bind_result = socket_bind($mysock,$address, $port) or die("Could not bind to address\n"); 
$listen_result = socket_listen($mysock, $server_users)  or die("Could not set up socket   listener\n");
$client = socket_accept($mysock) or die("Could not accept the connection to socket\n");

$seq_id =0;
do {
$input = ($seq_id == 0) ? socket_read($client, 12,PHP_BINARY_READ) : socket_read($client,1024,PHP_BINARY_READ);
echo $input;
} while(TRUE);
?>

私はそれをターミナルで実行します:

$php -q myscript.php

そして、netcatを使用してテストします。

$netcat 192.168.1.1 3320

問題は、socket_readが結果として1を返すことに関するものであり、これはどこにも文書化されていないことに注意してください。

于 2012-04-17T22:41:46.613 に答える