2011-07-24 103 views
0

我在網上找到了一些建立tcp連接的類。鏈接在here。我想定製一個類,到目前爲止,我可以建立一個連接發送數據和接收數據,這很好。一旦我已經創建並導入由我提供我可以使用下面的方法來建立連接的第一個鏈接中使用的類:在返回值之前等待iPhone

-(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秒,然後根據如果布爾變量didReciveData返回一個值= YES。

回答

1

由於您使用NSOutputStream,更好的方法是檢查[oStream write:]的返回值:如果返回-1,則沒有數據發送,因此沒有連接。

但是,如果您想等待兩秒鐘,則可以使用NSTimer來創建超時。如果您在定時器觸發前收到響應,則可以使定時器無效,否則定時器將調用通知兩秒結束的相關方法。

+0

當我發現[ostream的寫:]返回和int我想,也許這是解決方案。但是,如果我在出於某種原因提供不正確的IP地址時嘗試運行它,它不會返回任何內容。它只是等待在那裏。我會繼續嘗試...... –

+0

你等了多久?如果我提供了一個錯誤的IP,它需要一段時間,但最後它返回-1 ... – Saphrosit

+0

是的,但它是我的情況,我不知道爲什麼它需要永遠。我嘗試等待兩分鐘,當我到達時,應用程序被凍結:[oStream write:buf maxLength:strlen((char *)buf)];非常感謝Saphrosit –

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! 
} 
相關問題