2011-12-24 115 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