2010-06-03 101 views
0

我試圖創建一個簡單的IRC客戶端,純粹是爲了好玩,並嘗試和學習一些關於socket編程的目標C.Objective-C的socket流「錯誤的文件描述符」(IPhone)

所以我查看了一些示例代碼,我不知道爲什麼我無法在連接時發送或接收消息。

if (![urlString isEqualToString:@""]) { 
    NSURL* url = [NSURL URLWithString:urlString]; 
    if(!url){ 
     [self writeToOutput:@"Invalid Url"]; 
     return; 
    } 

    [self writeToOutput:@"Attempting Connection\n"]; 

    CFReadStreamRef readStream; 
    CFWriteStreamRef writeStream; 
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[url host], 6667, &readStream, &writeStream); 

    if(!readStream || !writeStream){ 
     [self writeToOutput:@"Connection Failed!\n"]; 
     return; 
    } 

    _inputStream = (NSInputStream *)readStream; 
    _outputStream = (NSOutputStream *)writeStream; 
    [_inputStream setDelegate:self]; 
    [_outputStream setDelegate:self]; 
    [_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [_inputStream open]; 
    [_outputStream open]; 
    [self writeToOutput:@"Connection Successful!\n"]; 
} 

然後我用從流以下爲讀/寫: 首先,我用下面的代碼連接到服務器

case NSStreamEventHasBytesAvailable: 
     if (stream == _inputStream) 
     { 
      //read data 
      uint8_t buffer[1024]; 
      int len; 
      while ([_inputStream hasBytesAvailable]) 
      { 
       len = [_inputStream read:buffer maxLength:1024]; 
       if (len > 0) 
       { 
        NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; 
        if (output != nil) 
        { 
         [self writeToOutput:output]; 
        } 
       } 
      } 
     } 
     break; 

    case NSStreamEventHasSpaceAvailable: 
     if (stream == _outputStream) 
     { 
       const uint8_t *rawString=(const uint8_t *)[message UTF8String];   
       int len; 

       len = [_outputStream write:rawString maxLength:[message length]]; 

       [self writeToOutput:[NSString stringWithFormat:@"%@\n",message]]; 
      } 
     } 
     break; 

當我得到一個NSStreamEventHasBytesAvailable事件,讀取任何消息(len == 0),當我寫入輸出流時,出現「Bad File Descriptor」錯誤。

發送/接收的消息只是字符串,我從蘋果開發者網站複製/粘貼了很多代碼,但我想我主要了解發生了什麼,並且不明白爲什麼它不會給我什麼!

任何想法或我只是在錯誤的網頁上完全?

P.S. writeToOutput是寫入屏幕上的輸出,而不是輸出流。混亂的命名,我應該改變...

回答

0

溶液實際上這裏列出,使用AsyncSocket類link AsyncSocket

但是如果有人能告訴我什麼是錯的上述那將是巨大的。據我所知,Async套接字類僅僅是我上面的功能的封裝,不是嗎?

相關問題