Objective-C的socket流“错误的文件描述符”(IPhone)

问题描述:

我试图创建一个简单的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是写入屏幕上的输出,而不是输出流。混乱的命名,我应该改变...

溶液实际上这里列出,使用AsyncSocket类link AsyncSocket

但是如果有人能告诉我什么是错的上述那将是巨大的。据我所知,Async套接字类仅仅是我上面的功能的封装,不是吗?