CFReadStreamRead在最后一次读取时阻塞

时间:2009-10-25 02:24:49

标签: iphone cocoa-touch

我在使用CFReadStream操作时出现问题,该操作似乎在最后一次读取后会持续很长时间。我似乎无法看到我的逻辑有什么问题。我使用CFStreamCreatePairWithSocketToCFHost函数将我的readstream连接到套接字。我正在使用写入流通过端口80发送标准HTTP GET请求,然后尝试将ReadStream加载到CFMTTHMessageRef对象中。我是在一个单元测试中完成这一切的,这个测试是绿色的,但是永远都需要。我确定它与服务器无关,因为我可以使用相同的请求使用NSURLRequest获得快速响应。这是我的循环:

  CFDataRef responseBody = CFDataCreateMutable(kCFAllocatorDefault, 0);
  CFHTTPMessageRef myMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, FALSE);
  CFIndex blockReadSize = 1024;
  UInt8 readBuffer[blockReadSize];
  NSLog(@"About to read stream...");
  CFIndex totoalRead = 0;
  for(CFIndex bytesRead = CFReadStreamRead(readStream, readBuffer, blockReadSize); bytesRead > 0; bytesRead = CFReadStreamRead(readStream, readBuffer, blockReadSize)) {
    totoalRead += bytesRead;
    NSLog(@"Reading stream... %i bytes read.", bytesRead);
    if (!CFHTTPMessageAppendBytes(myMessage, readBuffer, bytesRead)) {
      //Parse error
      NSLog(@"HTTP Read/Parse error!");
    }else{
      if (CFHTTPMessageIsHeaderComplete(myMessage)) {
        // Perform processing.
        NSLog(@"Header Complete");
      }else NSLog(@"Reading header");
    }
  }
  NSLog(@"Total bytes read %i", totoalRead);
  responseBody = CFHTTPMessageCopyBody(myMessage);

在最后一次读取时返回零,表示EOF挂起约1-3分钟。我哪里错了?

1 个答案:

答案 0 :(得分:0)

我终于弄明白了。我正在通过CF网络API测试HTTP Pipelining,因为我没有在写入流上关闭我的服务器连接,读取流上的最后一次读取会阻塞,因为套接字仍然是打开的,可用于更多的服务器数据。