0

PCアプリへのソケットを備えたiPhoeアプリを構築しています。このPCアプリから画像を取得する必要があります。「CFStreamCreatePairWithSocketToHost」を使用するのは初めてです。「NSOperation」でソケットを確立した後、


CFStreamClientContext streamContext = {0, self, NULL, NULL, NULL};
BOOL success = CFReadStreamSetClient(myReadStream, kMyNetworkEvents,MyStreamCallBack,&streamContext);
CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
それから私は電話します

CFWriteStreamWrite(myWriteStream, &writeBuffer, 3);
// Open read stream.
 if (!CFReadStreamOpen(myReadStream)) {
  // Notify error
 }
.
.
.
while(!cancelled && !finished) {
  SInt32 result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.25, NO);

if (result == kCFRunLoopRunStopped || result == kCFRunLoopRunFinished) { break; }

if (([NSDate timeIntervalSinceReferenceDate] - _lastRead) > MyConnectionTimeout) { // Call timed out cancelled = YES;

break; }

// Also handle stream status CFStreamStatus status = CFReadStreamGetStatus(myReadStream); }

そして、「kCFStreamEventHasBytesAvailable」を取得すると、

while (CFReadStreamHasBytesAvailable(myReadStream))
{
   CFReadStreamRead(myReadStream, readBuffer, 1000);
//and buffer the the bytes
}
それは予測不可能であり、時には全体像を把握し、時にはその一部を把握し、何が違うのか理解できません。誰かがここで何が悪いのかを知ることができますか?ありがとう

4

1 に答える 1

2

を取得すると、一部kCFStreamEventHasBytesAvailableのバイトのみが使用可能になり、残りのバイトは後で到着する可能性があります。

合計5,000バイトを期待していると想像してください。

ネットワークのタイミングが予測できないため、これは1つのシナリオです。

  1. それぞれ1,000バイトを含む2つのパケットは、ほぼ即座に到着します。
  2. kCFStreamEventHasBytesAvailable2,000バイトが待機しているため、コールバックが呼び出されます。
  3. あなたはwhileループを2回コードループし、毎回1,000バイトを消費します。
  4. 使用可能なバイトがなくなっwhileたため、ループは終了します。現在待機中のバイトがないにもかかわらず、コードはまだすべてのデータを持っていないことを認識していますか?CFReadStream
  5. 1,000バイトを含む別のパケットが到着します。
  6. 1,000バイト以上待機しているため、コールバックが再度呼び出されます。この2回目のコールバックの準備はできていますか?kCFStreamEventHasBytesAvailable
  7. 手順5と6はさらに2回行われます。
于 2010-10-15T19:49:37.533 に答える