2011-12-24 117 views
0

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

我错过了什么?

这是一个功能我用它来初始化连接:

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

回答

0

您似乎认为,当你得到的数据从另一端的主机一直可用。

我不知道底层协议是什么,但一般情况下,远程端会尝试发送1600字节并且您将获得1500字节,但必须等待几个毫秒(甚至秒)为接下来的100个字节。同时CFReadStreamHasBytesAvailable将返回false,因此即使您没有读取服务器发送的所有数据,您的代码也会设置完成标志。

+0

我用苹果文档参考的一个例子来制作这个功能。你有没有更好的解决方案的例子? – Andreas 2011-12-24 02:38:54

+0

它完全取决于连接的另一端在做什么。某些协议在开始时会告诉您需要多少数据,其他协议会使用特殊标记来表示最终数据或其他方法,告诉您是否需要更多数据。其他人在完成时只关闭连接。你需要什么方法来阅读有关的文档/规范,以便在你认为自己已经完成的时候解决问题 – 2011-12-24 02:41:52

+0

好吧,它完全取决于我,因为我还编写了服务器程序。我会实施一个结束标记谢谢你的提示。但主要问题仍然存在。每次我从套接字读取仍然有来自旧请求的数据,我的意思是对旧请求的完全响应,而不仅仅是它的一个片段。 – Andreas 2011-12-24 02:51:41