2011-07-24 8 views
0

インターネット上にいくつかのクラスがあり、tcp接続を確立しました。リンクはhereです。私はクラスをカスタマイズしたいと思います。これまでのところ、データを送信してデータを受け取る接続を確立することができました。私は自分のアプリケーション上で、このクラスをたくさん使用するつもりですので、私は値を返す前に待ってください

-(void) connectToServerUsingCFStream:(NSString *) urlStr portNo: (uint) portNo { 

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, 
             (CFStringRef) urlStr, 
             portNo, 
             &readStream, 
             &writeStream); 

    if (readStream && writeStream) { 
     CFReadStreamSetProperty(readStream, 
           kCFStreamPropertyShouldCloseNativeSocket, 
           kCFBooleanTrue); 
     CFWriteStreamSetProperty(writeStream, 
           kCFStreamPropertyShouldCloseNativeSocket, 
           kCFBooleanTrue); 

     iStream = (NSInputStream *)readStream; 
     [iStream retain]; 
     [iStream setDelegate:self]; 
     [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
          forMode:NSDefaultRunLoopMode]; 
     [iStream open]; 

     oStream = (NSOutputStream *)writeStream; 
     [oStream retain]; 
     [oStream setDelegate:self]; 
     [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
          forMode:NSDefaultRunLoopMode]; 
     [oStream open];  

    } 
} 

:私は次のメソッドを使用して接続を確立できていて最初のリンクで使用されるクラスを作成し、インポートした後自分のクラスを作成し、-(BOOL) connect{}メソッドを作成したいと考えています。私はイエスを返そうとしています接続は確立されており、それ以外の場合はありません。問題は、私が接続を確立するかどうかを知る方法は、データを送信しようとする接続を作成し、次にサーバー側で、文字列を送り返すたびにメソッドを作成したことです。次の2秒以内にデータが受信された場合は、接続が確立されていることがわかります。

私の接続方法では、2秒待ってから、BOOL変数didReciveData = YESに応じて値を返します。

答えて

1

NSOutputStreamを使用しているので、より良い方法は、[oStream write:]の戻り値をチェックすることです。-1を返した場合、データは送信されていないため、接続はありません。

ただし、2秒間待つ場合は、NSTimerを使用してタイムアウトを作成することができます。タイマーが起動する前に応答を受け取った場合は、タイマーを無効にすることができます。それ以外の場合、タイマーは2秒間を通知する関連メソッドを呼び出します。

+0

[oStream write:]が返され、intが返されたとき、私はそれが解決策である可能性があると考えました。しかし、何らかの理由で間違ったIPアドレスを提供したときにそれを実行しようとすると、何も返されません。それはちょうどそこに待っている。私は試し続けます... –

+0

あなたはどれくらい待っていましたか?私が間違ったIPを提供するとしばらく時間がかかりますが、最後に-1を返します。 – Saphrosit

+0

ええ、それは私の場合、なぜそれが永遠にかかるのか分かりません。私は2分待ってみましたが、アプリが凍ってから届きました。[oStream write:buf maxLength:strlen((char *)buf)];助けてくれてありがとうサフロジット –

1

メイン実行ループを一時停止することができます。

- (void)test 
{ 
    NSLog(@"Test starting."); 

    BOOL wasSuccessful = [self connect]; 
    NSLog(@"Success: %d", wasSuccessful); 
} 

- (BOOL)connect 
{ 
    // try to connect here, make sure to get a callback on success/failure 

    // fake callback 
    [self performSelector:@selector(callback:) withObject:[NSNumber numberWithBool:NO] afterDelay:2.0]; 

    // wait for callback 
    CFRunLoopRun(); 
    return self.success; 
} 

- (void)callback:(NSNumber *)successful 
{ 
    self.success = [successful boolValue]; 

    CFRunLoopStop(CFRunLoopGetCurrent()); // now we want -connect to return! 
} 
関連する問題