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;
}
`
誰かが私を助けてくれたらいいのに!