Блоки CFReadStreamRead при последнем чтении - PullRequest
0 голосов
/ 25 октября 2009

У меня проблемы с операцией CFReadStream, которая, кажется, блокируется в течение очень долгого времени после последнего чтения. Кажется, я не вижу ничего плохого в моей логике. Я подключаю свой поток чтения к сокету, используя функцию CFStreamCreatePairWithSocketToCFHost. Я отправляю стандартный запрос HTTP GET через порт 80, используя поток записи, а затем пытаюсь загрузить 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 голосов
/ 19 ноября 2009

Я наконец понял это. Я тестировал HTTP Pipelining через сетевой API-интерфейс CF, и поскольку я не закрывал соединение с сервером в потоке записи, последнее чтение в потоке чтения будет блокироваться, поскольку сокет все еще открыт и доступен для дополнительных данных сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...