我在使用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分钟。我哪里错了?
答案 0 :(得分:0)
我终于弄明白了。我正在通过CF网络API测试HTTP Pipelining,因为我没有在写入流上关闭我的服务器连接,读取流上的最后一次读取会阻塞,因为套接字仍然是打开的,可用于更多的服务器数据。