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;
}
}
この関数を作成するには、appleのdocリファレンスの例を使用しました。よりよい解決策の例がありますか? – Andreas
これは接続の相手側が何をしているかによってまったく異なります。いくつかのプロトコルは、最初にどのくらいのデータを予期するかを示し、他のプロトコルは終わりを示す特別なマーカーや、より多くのデータを期待するかどうかを指示する他の方法を持っています。他の人は、接続が完了したら接続を閉じるだけです。どのような方法でも、ドキュメント/仕様書を読んで、自分が「完了」していると思うときにうまくいくようにする必要があります。 –
私は最後のマーカーを実装して、ヒントをありがとう。しかし、主な問題が残っています。ソケットから読み取るたびに、古いリクエストのデータが残っています。これは、古いリクエストに対する完全な応答です。 – Andreas