У меня проблемы с операцией 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 минут. Куда я иду не так?