0

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;
        }
}   
4

1 に答える 1

0

相手側のホストからデータを取得すると、常にすべて一度に利用できると想定しているようです。

基礎となるプロトコルが何であるかはわかりませんが、一般に、リモート エンドが 1600 バイトを送信しようとして、1500 バイトを取得しても、数ミリ秒 (または数秒) 待機する必要がある可能性は十分にあります。次の 100 バイト。その間CFReadStreamHasBytesAvailable、 false が返されるため、サーバーが送信したすべてのデータを読み取っていなくても、コードは完了フラグを設定します。

于 2011-12-24T02:25:55.127 に答える