最近、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回目の読み取り=正しいデータ。