2010-10-19 5 views
2

J'ai un problème avec le socket TCP d'écriture dans l'objectif c. J'ai l'erreur suivante quand je puis écrire une chaîne à mon serveur. un peu d'aide s'il vous plaît?problème avec l'écriture TCP socket dans l'objectif c (message d'erreur)

  • écriture d'erreur de flux < __NSCFOutputStream: 0x102009f0>:. Erreur Domaine = NSPOSIXErrorDomain Code = 9 "

les éléments suivants sont mon code avance inn Merci

- (void)setup { 

    host = // some adderss; 
    port = // port; 

    NSURL *url = [NSURL URLWithString:host]; 

    NSLog(@"Setting up connection to %@ : %i", [url absoluteString], port); 

    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)[url host], port, &readStream, &writeStream); 

    if(!CFWriteStreamOpen(writeStream)) { 
     NSLog(@"Error, writeStream not open"); 

     return; 
    } 


    [self open]; 

    NSLog(@"Status of outputStream: %i", [outputStream streamStatus]); 

    return; 
} 

- (void)open { 
    NSLog(@"Opening streams."); 
    CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 
    CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); 

    inputStream = (NSInputStream *)readStream; 
    outputStream = (NSOutputStream *)writeStream; 

    [inputStream retain]; 
    [outputStream retain]; 

    [inputStream setDelegate:self]; 
    [outputStream setDelegate:self]; 

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

    [inputStream open]; 
    [outputStream open]; 
} 

- (void)close { 
    NSLog(@"Closing streams."); 

    [inputStream close]; 
    [outputStream close]; 

    [inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

    [inputStream setDelegate:nil]; 
    [outputStream setDelegate:nil]; 

    [inputStream release]; 
    [outputStream release]; 

    inputStream = nil; 
    outputStream = nil; 
} 

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)event { 
    NSLog(@"Stream triggered."); 
    NSLog(@"dddd%i", event); 

    switch(event) { 
     case NSStreamEventHasSpaceAvailable: { 
      if(stream == outputStream) { 
       NSLog(@"outputStream is ready."); 


       NSString *s [email protected]"12"; 

       [self writeOut:s]; 
      } 
      break; 
     } 
     case NSStreamEventHasBytesAvailable: { 
      if(stream == inputStream) { 
       NSLog(@"inputStream is ready."); 

       uint8_t buf[1024]; 
       unsigned int len = 0; 

       len = [inputStream read:buf maxLength:1024]; 

       if(len > 0) { 
        NSMutableData* data=[[NSMutableData alloc] initWithLength:0]; 

        [data appendBytes: (const void *)buf length:len]; 

        NSString *s = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 

        [self readIn:s]; 

        [data release]; 
       } 
      } 
      break; 
     } 
     default: { 
      NSLog(@"Stream is sending an Event: %i", event); 

      break; 
     } 
    } 
} 

- (void)readIn:(NSString *)s { 



    NSLog(@"Reading in the following:"); 
    NSLog(@"%@", s); 
} 

- (void)writeOut:(NSString *)s { 
    uint8_t *buf = (uint8_t *)[s UTF8String]; 

    NSInteger nwritten=[outputStream write:buf maxLength:strlen((char *)buf)]; 
    if (-1 == nwritten) { 
     NSLog(@"Error writing to stream %@: %@", outputStream, [outputStream streamError]); 
    } else { 
     NSLog(@"Wrote %ld bytes to stream %@.", (long)nwritten, outputStream); 
    } 
    NSLog(@"Writing out the following:"); 
    NSLog(@"%@", s); 

Répondre

1

Votre code est en fait tout va bien et fonctionne (je l'ai testé) L'erreur que vous obtenez a le code d'erreur 9 dans le domaine POSIX, qui est EBADF (vous pouvez rechercher les codes d'erreur posix dans /usr/include/sys/errno.h).signifie que vous essayez d'écrire dans un descripteur de fichier non valide - vous n'avez pas vraiment ouvert le socket. Je suppose que vous n'avez pas montré l'erreur. Quelle est la valeur réelle de la chaîne host? Si c'est juste le nom d'hôte ou l'adresse IP cela ne peut pas fonctionner, puisque vous construisez une URL et prenez la partie hôte de cette URL pour vous connecter.

+0

Salut, la valeur de mon hôte est la suivante: par exemple. host = @ "12.123.123.123" est-ce exact? Comment devrais-je y aller? – tan

+0

Salut, merci beaucoup. Je l'ai eu le travail. Mon hôte est juste une adresse IP, c'est pourquoi il ne fonctionne pas. Mais maintenant mon code continue à écrire sur le serveur et ne pas le relire. Une idée à ce sujet? mon serveur est supposé envoyer quelque chose et mon code est supposé relire ce message. S'il vous plaît aidez. Merci à abvance – tan

1

J'ai eu ce même problème et 2 choses résolu pour moi:

1) attendre jusqu'à ce que la prise était complètement ouvert: je testais le code à l'aide d'un outil de ligne de commande Foundation, qui disparaîtrait avant la socket a eu une chance de s'ouvrir complètement. Ceci a été corrigé avec une boucle simple comme ceci:

int i = 0; 
while(i++ < 20) 
{ 
    NSLog(@" has space %i, %i", [socket hasSpace], i); 
    if(![socket hasSpace]) 
     continue; 
    [socket writeOut:@"Hello world"]; 
    break; 
} 

hasSpace était simplement retournaient [outputStream hasSpaceAvailable]

2) je tente de se connecter à un serveur en utilisant l'hôte NSString*"localhost", quand il aurait dû être "http://localhost"