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, даже если вы не прочитали все данные, отправленные сервером.

Другие вопросы по тегам