首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CFReadStream的异步IO

使用CFReadStream的异步IO
EN

Stack Overflow用户
提问于 2010-07-27 21:16:47
回答 2查看 2.6K关注 0票数 1

这是Asynchronous IO with CFWriteStream的兄弟问题。我正在使用CFReadStreamScheduleWithRunLoop和CFReadSteamRead进行异步IO。我们如何使用阻塞来安全地检索所有日期?

假设消息的实际大小是1200 (但我们不知道),我的读缓冲区大小是1024。调用CFReadStreamRead将检索多达1024字节的数据,但由于我们不知道消息的大小,因此应该重复调用CFReadStreamRead。问题是,因为我们不知道流套接字已经接收了多少数据,所以CFReadStreamRead可能会阻塞第二次调用。我们如何避免这个问题呢?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2010-08-05 17:04:29

在您的流上再次调用CFReadStreamHasBytesAvailable(),看看从流中读取是否仍然安全(或者知道的唯一方法是尝试)。

票数 2
EN

Stack Overflow用户

发布于 2011-03-07 18:54:46

我已经添加了一个示例代码,它为我完成了这项工作。它正在使用CFReadStreamHasBytesAvailable()。检查流的状态很重要,否则可能会陷入无休止的循环。我的示例还包括超时处理。

代码语言:javascript
复制
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;
        }   
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3343984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档