这是Asynchronous IO with CFWriteStream的兄弟问题。我正在使用CFReadStreamScheduleWithRunLoop和CFReadSteamRead进行异步IO。我们如何使用阻塞来安全地检索所有日期?
假设消息的实际大小是1200 (但我们不知道),我的读缓冲区大小是1024。调用CFReadStreamRead将检索多达1024字节的数据,但由于我们不知道消息的大小,因此应该重复调用CFReadStreamRead。问题是,因为我们不知道流套接字已经接收了多少数据,所以CFReadStreamRead可能会阻塞第二次调用。我们如何避免这个问题呢?
谢谢!
发布于 2010-08-05 17:04:29
在您的流上再次调用CFReadStreamHasBytesAvailable(),看看从流中读取是否仍然安全(或者知道的唯一方法是尝试)。
发布于 2011-03-07 18:54:46
我已经添加了一个示例代码,它为我完成了这项工作。它正在使用CFReadStreamHasBytesAvailable()。检查流的状态很重要,否则可能会陷入无休止的循环。我的示例还包括超时处理。
NSMutableData* bodyData = [NSMutableData dataWithCapacity:kHTTPReadStreamBufferSize];
NSDate* startTimeStamp = [NSDate date];
while (TRUE) {
if (CFReadStreamHasBytesAvailable(httpReadStream)) {
startTimeStamp = [NSDate date];
UInt8* streambuffer = malloc(kHTTPReadStreamBufferSize);
int readBytes = CFReadStreamRead (httpReadStream,streambuffer,kHTTPReadStreamBufferSize);
NSLog(@"Read: %d",readBytes);
[bodyData appendBytes:streambuffer length:readBytes];
free(streambuffer);
}
if (CFReadStreamGetStatus(httpReadStream) == kCFStreamStatusError) {
*error = (NSError*)CFReadStreamCopyError (httpReadStream);
if ([*error code] == 61) {
NSLog(@"Error occured: %d",[*error code]);
// connection refused
[PlusError errorForDomainWithCode:kPlusHostUnreachable errorDescription:NSLocalizedString(@"kPlusHostUnreachable",@"")
underlyingError:nil url:nil toError:error];
}
*responseHeader = nil;
*bodyContent = nil;
break;
}
if (CFReadStreamGetStatus(httpReadStream) == kCFStreamStatusAtEnd) {
NSLog(@"Stream reached end!");
*responseHeader = (CFHTTPMessageRef)CFReadStreamCopyProperty(httpReadStream, kCFStreamPropertyHTTPResponseHeader);
*error = nil;
break;
}
// timeout management
NSTimeInterval timeInterval = [startTimeStamp timeIntervalSinceNow]*-1;
if (timeInterval >= kHTTPReadTimeOutTimeInSeconds) {
[PlusError errorForDomainWithCode:kPlusResourceLoadingError errorDescription:NSLocalizedString(@"kPlusResourceLoadingError",@"")
underlyingError:nil url:nil toError:error];
break;
}
}https://stackoverflow.com/questions/3343984
复制相似问题