5

これは、ネットワーク ソケットから受信したプレフィックス付きメッセージの処理方法に関する追加の質問です。私がやろうとしていることは次のとおりです。

  1. 最初の 4 バイトを読み取ります (これは $prefix であり、メッセージの長さを表します)
  2. $prefix のサイズが実際に 4 バイトで、整数かどうかを確認します
  3. $prefix からの長さを使用して完全な $message を読み取ります
  4. メッセージのサイズが実際に $prefix バイトであるかどうかを確認します

これまでのところ、次の 2 行のコードがあります。

    $prefix = socket_read($socket, 4, PHP_BINARY_READ); //No 1.
    //No 2: how to do the checks?
    $message = socket_read($socket, $prefix, PHP_BINARY_READ); //No 3.
    //No 4: how to do the checks?

上記のチェックを行うにはどうすればよいですか?

補足: ネットワーク ソケット接続を介して送信されるすべてのデータは UTF8、リトル エンディアンです。

4

1 に答える 1

5

以下を使用するだけで、受け取ったバイナリ文字列の長さを検証できますstrlen

$prefix = socket_read($socket, 4, PHP_BINARY_READ);
if (strlen($prefix) != 4) {
    // not 4 bytes long
}

前の質問によると、このバイナリ文字列は 32 ビットの長さを表します。そのように(パックするときに使用するのと同じフォーマット指定子を使用して)解凍し、メッセージをフェッチして、再度使用して長さを検証します。strlen

$length = current(unpack('l', $prefix));
$message = socket_read($socket, $length, PHP_BINARY_READ);
if (strlen($message) != $length) {
    // $message not the size of $length
}
于 2012-03-18T04:30:57.987 に答える