CFStream IOS Сокет связи - PullRequest
       19

CFStream IOS Сокет связи

0 голосов
/ 24 декабря 2011

как я могу очистить буфер 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 Ответ

0 голосов
/ 24 декабря 2011

Похоже, вы предполагаете, что когда вы получаете данные с хоста на другом конце, они всегда будут доступны сразу за один раз.

Я не знаю, что такое базовый протокол, но в целом этоВполне возможно, что удаленный конец попытается отправить 1600 байтов, и вы получите 1500 байтов, но затем придется ждать несколько миллисекунд (или даже секунд) для следующих 100 байтов.Между тем CFReadStreamHasBytesAvailable вернет false, и ваш код установит ваш флаг done, даже если вы не прочитали все данные, отправленные сервером.

...