2010-06-03 3 views
0

Je suis en train de créer un simple client IRC, purement pour le plaisir et pour essayer d'en apprendre un peu plus sur la programmation de prise dans l'objectif C.Objective-C Socket Streams « Bad Description du fichier » (iPhone)

donc J'ai regardé un exemple de code et je n'ai aucune idée pourquoi je ne peux pas sembler envoyer ou recevoir un message lors de la connexion. Tout d'abord je me connecter au serveur en utilisant le code suivant:

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"]; 
} 

J'utilise ensuite ce qui suit pour la lecture/écriture des flux:

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; 

Quand je reçois un événement NSStreamEventHasBytesAvailable, aucun message est lu (len == 0) et quand j'écris dans le flux de sortie, j'obtiens une erreur "Bad File Descriptor". Les messages envoyés/reçus ne sont que des chaînes, j'ai copié/collé beaucoup de code sur le site du développeur Apple, mais je pense que je comprends surtout ce qui se passe et ne comprends pas pourquoi il ne me donne pas quelque chose!

Des idées ou suis-je juste sur la mauvaise page totalement?

P.S. writeToOutput doit écrire sur la sortie à l'écran, pas sur le flux de sortie. dénomination Confondre, je devrais changer ça ...

Répondre

0

La solution a été effectivement décrit ici, en utilisant la classe AsyncSocket link AsyncSocket

Cependant, si quelqu'un pouvait me dire ce qui se passait au-dessus de ce serait génial. Pour autant que je sache, la classe de socket Async est juste un emballage pour la fonctionnalité que j'ai ci-dessus n'est-ce pas?