0

クライアント (iPhone) をサーバーに接続する必要があるプロジェクトを開発しています。CFStream、NSStreamなどを使用してこれを行いました。サーバーは、クライアントで「1つずつ」処理する必要があるデータパケットを送信します。問題は、サーバーが 2 つのデータ パケットを次々に送信することがあるため、クライアントで ([inputStream hasBytesAvailable] を介して) 受信したものが両方のデータ パケットの連結であることです。

サーバーからクライアントへのデータ パケットのアーキテクチャは、"data"+b'00000000' (バイナリ NULL) です。「00000000」バイトがある場合、そのパケットを処理してバッファを空にする必要があることをプログラムに知らせる方法を知りたいです。

私が使用しているコードは次のとおりです。

case NSStreamEventHasBytesAvailable:

    if (theStream == inputStream) {

        uint8_t buffer[1024];
        int len;

        while ([inputStream hasBytesAvailable]) {
            len = [inputStream read:buffer maxLength:sizeof(buffer)];
            if (len > 0) {

                NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

                if (nil != output) {
                    [self processData:output];
                    NSLog(@"OUTPUT: %@", output);
                }
            }
        }
    }
    break;

例。サーバーは次を送信します: msg1_whatever (連結) b'0000000' そしてその直後に、次を送信します: msg2_whatever + b'00000000'

次に、NSLog に次のように表示されます。

2 つの分離された文字列の代わりに。msg1 と msg2 の送信の間に少し時間があれば、問題なく機能しますが、この例外は数回発生するため、処理する必要があります。

4

1 に答える 1

1

プロトコルを再設計する必要があります。ここでの主な問題は、メッセージ自体の前に送信するメッセージのサイズを指定しないため、各メッセージの入力ストリームから読み取る量がわからないことです。

以下は、非常に単純なプロトコルの例です。各メッセージは次の 2 つのフィールドで構成されます。

  1. サイズ (符号なし int)。
  2. メッセージそのもの。

次に、メッセージごとに 2 回読みます。最初に、メッセージのサイズをsizeof(unsigned int)読み取り、次にメッセージ自体を読み取ります (これでサイズがわかります)。

これにより、メッセージを正しくエスケープしないとメッセージ内で発生する可能性があり、深刻な問題を引き起こす可能性がある、メッセージ間の null セパレーターの必要性もなくなります。

于 2013-07-03T20:00:27.763 に答える