【问题标题】:CFStream IOS Socket communicationCFStream IOS Socket 通信
【发布时间】:2011-12-24 02:13:18
【问题描述】:

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

我错过了什么吗?

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

-(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");
    }

}

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

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;
        }
}   

【问题讨论】:

    标签: iphone objective-c ios sockets cfreadstream


    【解决方案1】:

    您似乎认为,当您从另一端的主机获取数据时,它总是一次性可用。

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

    【讨论】:

    • 我使用了苹果文档参考中的一个例子来实现这个功能。您有更好解决方案的示例吗?
    • 这完全取决于连接的另一端在做什么。一些协议会在开始时告诉您期望有多少数据,其他协议有特殊标记来表示结束或其他方法告诉您是否期望更多数据。其他人只是在完成后关闭连接。当您认为自己“完成”时,您需要什么方法来阅读相关文档/规范来解决问题
    • 好吧,这完全取决于我,因为我也对服务器进行了编程。我将实施一个结束标记,谢谢您的提示。但主要问题仍然存在。每次我从套接字读取时,仍然有来自旧请求的数据,我的意思是对旧请求的完整响应,而不仅仅是它的片段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2020-04-03
    • 2017-07-02
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多