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

この関数を作成するには、appleのdocリファレンスの例を使用しました。よりよい解決策の例がありますか? – Andreas

+0

これは接続の相手側が何をしているかによってまったく異なります。いくつかのプロトコルは、最初にどのくらいのデータを予期するかを示し、他のプロトコルは終わりを示す特別なマーカーや、より多くのデータを期待するかどうかを指示する他の方法を持っています。他の人は、接続が完了したら接続を閉じるだけです。どのような方法でも、ドキュメント/仕様書を読んで、自分が「完了」していると思うときにうまくいくようにする必要があります。 –

+0

私は最後のマーカーを実装して、ヒントをありがとう。しかし、主な問題が残っています。ソケットから読み取るたびに、古いリクエストのデータが残っています。これは、古いリクエストに対する完全な応答です。 – Andreas