3

getBuffer:length:NSInputStreamのメソッドを本当に使いたいです。多くの調査の結果、ほとんどの人が本当に必要としていたため、この方法を使用する有効な例を見つけることができませんでしread: maxLength:た。

だから今、周囲のいくつかの事実:*私はiPhone、iOS3.1.3用のアプリを開発しています*私はソケットを介してネットワーク通信を確立しました*そのネットワーク接続は実際に機能します。だから私はランループや有効なデリゲートなどにストリームを追加することを忘れませんでした-それはすでに機能しています*私はネットワークを介して文字列を送受信しているだけです。*実装する有効なデリゲートを設定しましたstream: handleEvent:正しく(受信したイベントを区別し、適切なアクションを実行します)。メッセージを2回受信することがあるため、受信コードが100%正しいかどうかはわかりません。これは、通信しているデバイスの実装に問題がある可能性もあります。最後のポイントのどれであるかを把握するために、「NSStreamEventHasBytesAvailable」イベントを受信したときに、受信バッファーに実際に何バイトあるかを調べようとしています。実装が正しいかどうかはわかりませんが、実際に受け取ったバイト数を知りたいので、後で使用getBuffer: length:して長さを確認したいと思いました。奇妙なことに、長さはコンソールに印刷されません。 [((NSInputStream *) stream) getBuffer: &buf length: &numBytes]常にFALSEと評価されます。とにかく、その後のコードの部分は正しく機能し、バッファでメッセージを受信して​​正しく転送します-うまく機能します。疑問が残ります:なぜ機能しないgetBuffer: length:のですか?関心のあるコードはここにあります:

`ケースNSStreamEventHasBytesAvailable:{

        uint8_t *buf;
        unsigned int numBytes;

        if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) {
            NSLog(@"\t\tBytes in the buffer: %i", &numBytes);
        }

        uint8_t buffer[BUFFER_SIZE];
        int len = [((NSInputStream *) stream) read: buffer 
                                         maxLength: BUFFER_SIZE];
        NSLog(@"\tread: %i bytes", len);

        /*
         if len > 0: len is equal to the filled byte elements
         if len == 0: end of buffer was reached while reading
         if len < 0: something terrible happened...
         */
        if (len > 0) {
            /* 1. create string from received byte buffer */
            NSString *msg = [[NSString alloc] initWithBytes: buffer length: len encoding: NSASCIIStringEncoding];
            NSLog(@"\tcontained message: %@", msg);
            /* 2. inform communicator about received message */
            [communicator received: msg];
            [msg release];
        }

        if (len < 0) {
            [communicator received: @"Error!"];
        }
        break;
    }

`

誰かが私を助けてくれたらいいのに!

4

3 に答える 3

10

ダーウィンはオープンソースなので、「真実はそこにあります」。NSStreamのソースは、GSInetInputStreamがソケットのNSInputStreamを実装するクラスであり、そのクラスのgetBuffer:length:の実装が質問に簡潔に答えることを示しています。

- (BOOL) getBuffer: (uint8_t **)buffer length: (unsigned int *)len
{
  return NO;
}

ここで見つかりました。

于 2010-12-15T20:29:01.947 に答える
0

まだバッファがないため、getBufferが機能していないと思います。後でバッファに読み込んでいるため、バッファへのポインタをまだ取得できません...

于 2010-10-31T23:45:16.237 に答える
0

ああ、私はあなたが言っていることを理解していると思います。しかし、少なくともバッファに読み込んだ後、次のコードはTRUEと評価されるはずだと思いますか?それが機能しないので、私はただ尋ねています、getBuffer:length:それでも機能しないようです。使用可能なバイトを使用した通信はうまく機能しますが、問題は残ります...

        uint8_t *buf1;
        unsigned int numBytes1;
        if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) {
            NSLog(@"\t\tBytes are in the buffer before Op.");
        }

        uint8_t buffer[BUFFER_SIZE];
        int len = [((NSInputStream *) stream) read: buffer 
                                         maxLength: BUFFER_SIZE];

        uint8_t *buf2;
        unsigned int numBytes2;
        if ([((NSInputStream *) stream) getBuffer: &buf2 length: &numBytes2]) {
            NSLog(@"\t\tBytes in the buffer after Op.");
        }

私自身の質問に対する答えを作成して申し訳ありません。しかし、コメントは非常に多くのコードを処理することができました...

于 2010-11-10T14:38:26.030 に答える