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,000 字节,几乎立即到达。
  2. 调用您的回调是kCFStreamEventHasBytesAvailable因为有 2,000 个字节在等待。
  3. 您通过while循环两次进行代码循环,每次消耗 1,000 个字节。
  4. while循环退出,因为没有CFReadStream更多可用字节。即使当前没有更多字节等待,您的代码是否识别出您还没有所有数据?
  5. 另一个包含 1,000 字节的数据包到达。
  6. 因为还有 1,000 个字节在等待,所以再次调用您的回调。你准备好迎接第二次回调了吗?kCFStreamEventHasBytesAvailable
  7. 步骤 5 和 6 再发生两次。
于 2010-10-15T19:49:37.533 回答