如何清除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;
}
}
您似乎认为,当您从另一端的主机获得数据时,它将始终是可用的。
我不知道底层协议是什么,但一般来说,远程端完全有可能尝试发送1600字节,而您将获得1500字节,但随后必须等待几毫秒(甚至几秒钟)才能获得下一个100字节。同时,CFReadStreamHasBytesAvailable
将返回false,因此您的代码将设置您的完成标志,即使您没有读取服务器发送的所有数据。