2012-03-17 6 views
4

これは、ネットワークソケットから受信したプレフィックス付きメッセージを処理する方法についてのfollow-up questionです。私は何をしようとすると、次のとおりです。先頭の長さの値を持つプロセスソケットデータ

  1. $接頭辞が実際に4バイトの大きさを持っている場合、それはだ場合
  2. ($接頭辞で、メッセージの長さを表す)チェックを最初の4つのバイトを読みます整数
  3. メッセージが本当に$プレフィックスバイトのサイズ

を持っている場合はこれまでのところ、私は次の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? 
    

    上記の小切手はどうすればできますか?

    少しサイドノート:ネットワークソケット接続を介して送信されるすべてのデータはあなたが単にstrlenを用いて受信しているバイナリ文字列の長さを検証することができ、UTF8でリトルエンディアン

  • 答えて

    4

    です:

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

    あなたの前の質問によると、このバイナリ文字列は32ビット長を表します。 Unpackそのような(パック-INGのそれはあなたが使用するのと同じ書式指定子と)、そのメッセージを取得し、長さを検証するために、再度strlenを使用します。

    $length = current(unpack('l', $prefix)); 
    $message = socket_read($socket, $length, PHP_BINARY_READ); 
    if (strlen($message) != $length) { 
        // $message not the size of $length 
    } 
    
    +2

    おかげで再びあなたの助けのために、本当に感謝しています。 $接頭辞が整数かどうかを調べるには、$ length(is_int($ length))でアンパックされた値をチェックする必要があります。 – Mike

    +0

    @Mike: 'unpack'は、' $ prefix'が指定されたフォーマット(32ビット符号付きlong、上記の例では 'l')でない場合に' false'を返します。 unpackが 'false'以外の何かを返した場合、' is_int'をチェックする必要はありません。 – netcoder

    +0

    ありがとう、完璧な作品! – Mike

    関連する問題