CFStream IOS Socket Communication
Как я могу очистить буфер 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;
}
}
1 ответ
Похоже, вы предполагаете, что когда вы получаете данные от хоста на другом конце, они всегда будут доступны сразу.
Я не знаю, что является базовым протоколом, но в целом вполне возможно, что удаленный конец попытается отправить 1600 байтов и что вы получите 1500 байтов, но затем придется ждать несколько миллисекунд (или даже секунд) для следующие 100 байтов. между тем CFReadStreamHasBytesAvailable
вернет false и ваш код установит ваш флаг done, даже если вы не прочитали все данные, отправленные сервером.