首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CFStream IOS套接字通信

CFStream IOS套接字通信
EN

Stack Overflow用户
提问于 2011-12-24 10:13:18
回答 1查看 2.6K关注 0票数 0

如何清除CFStream缓冲区?每次我从套接字读取时,仍然有来自旧请求的数据,我的意思是对旧请求的完整响应,而不仅仅是它的一个片段。

我是不是漏掉了什么?

这是我用来初始化连接的函数:

代码语言:javascript
复制
-(void)openSocketConnection:(UInt32)port: (NSString *)host
{
  NSString *hoststring  = [[NSString alloc] initWithString:host];
  CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,(__bridge CFStringRef)hoststring ,
port,&_nnet_readStream,&_nnet_writeStream);

CFWriteStreamCanAcceptBytes(_nnet_writeStream);

CFWriteStreamSetProperty(_nnet_writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

CFReadStreamSetProperty(_nnet_readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

    if(!CFWriteStreamOpen(_nnet_writeStream)) {
        NSLog(@"Error Opening Write Socket");
    }
    if(!CFReadStreamOpen(_nnet_readStream)) {
        NSLog(@"Error Opening Write Socket");
    }

}

这是我用来从套接字读取数据的函数:

代码语言:javascript
复制
BOOL done = NO;
NSMutableString* result = [NSMutableString string];
while (!done) 
{
        if (CFReadStreamHasBytesAvailable(_nnet_readStream)) 
        {
            UInt8 buf[1024];
            CFIndex bytesRead = CFReadStreamRead(_nnet_readStream, buf, 1024);
            if (bytesRead < 0) 
            {
                CFStreamError error = CFReadStreamGetError(_nnet_readStream);
                NSLog(@"%@",error);
            } else if (bytesRead == 0) 
            {
                if (CFReadStreamGetStatus(_nnet_readStream) == kCFStreamStatusAtEnd) 
                {
                    done = YES;
                }
            } else 
            {
                [result appendString:[[NSString alloc] initWithBytes:buf length:bytesRead encoding:NSUTF8StringEncoding]];
            }
        } else 
        {
            done = YES;
        }
}   
EN

回答 1

Stack Overflow用户

发布于 2011-12-24 10:25:55

您似乎认为,当您从另一端的主机获取数据时,这些数据将总是一气呵成。

我不知道底层协议是什么,但一般来说,远程端完全有可能尝试发送1600个字节,而您将获得1500个字节,然后必须等待几毫秒(甚至几秒钟)才能获得下一个100个字节。同时,CFReadStreamHasBytesAvailable将返回false,因此您的代码将设置done标志,即使您尚未阅读服务器发送的所有数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8622239

复制
相关文章

相似问题

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