从CFStreamCreatePairWithSocketToHost获取数据的问题

时间:2010-06-09 07:37:23

标签: iphone objective-c sockets nsstream

我正在构建一个带有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
}
这是不可预测的,有时我会全面了解,有时我只是其中的一部分,我无法理解是什么造成了不同。 谁能知道这里有什么问题? 感谢

1 个答案:

答案 0 :(得分:2)

当你得到kCFStreamEventHasBytesAvailable时,可能只有某些的字节可用,剩下的字节直到稍后才会到达。

想象一下,你期待总共5,000个字节。

由于无法预测的网络时间,这是一种情况:

  1. 两个数据包,每个包含1,000个字节,几乎立即到达。
  2. 使用kCFStreamEventHasBytesAvailable调用您的回调,因为有2,000个字节在等待。
  3. 您的代码循环通过while循环两次,每次消耗1,000个字节。
  4. while循环退出,因为CFReadStream没有更多可用字节。 即使目前没有更多字节在等待,您的代码是否认识到您还没有所有数据?
  5. 另一个包含1,000个字节的数据包到达。
  6. 使用kCFStreamEventHasBytesAvailable再次调用 回调您的回调,因为还有1,000个字节在等待。 你准备好接受第二次回调吗?
  7. 步骤5& 6再发生两次。