2011-06-23 2 views
2

J'utilise la connexion tcp pour connecter un serveur en utilisant ip et port. Je peux écrire et lire des flux dessus. mon problème est quand j'éteins le serveur .app stop avec "EXC_BAD_ACCESS" quelqu'un peut-il m'aider?Problème ios Socket Stream

ce code est en connexion:

-(void) connectToServerUsingStream:(NSString *)urlStr 
          portNo: (uint) portNo { 

    if (![urlStr isEqualToString:@""]) 
    { 
     NSURL *website = [NSURL URLWithString:urlStr]; 
     if (!website) 
     { 
      NSLog(@"%@ is not a valid URL"); 
      return; 
     } 
     else 
     { 
      [NSStream getStreamsToHostNamed:urlStr 
             port:portNo 
           inputStream:&iStream 
           outputStream:&oStream];    
      [iStream retain]; 
      [oStream retain]; 

      [iStream setDelegate:self]; 
      [oStream setDelegate:self]; 

      [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
           forMode:NSDefaultRunLoopMode]; 
      [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
           forMode:NSDefaultRunLoopMode]; 
      [oStream open]; 

      [iStream open];    
     } 
    }  
} 

et ce délégué est l'événement de flux:

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { 
    switch(eventCode) { 
     case NSStreamEventHasBytesAvailable: 
     { 
      if (data == nil) 
      { 
       data = [[NSMutableData alloc] init]; 
      } 
      uint8_t buf[1024]; 
      unsigned int len = 0; 
      len = [(NSInputStream *)stream read:buf maxLength:1024]; 
      if(len) 
      {  
       [data appendBytes:(const void *)buf length:len]; 
       int bytesRead; 
       bytesRead += len; 

      } 
      else 
      { 

       NSLog(@"No data."); 
       return; 
      } 

      NSString *str = [[NSString alloc] initWithData:data 
                encoding:NSUTF8StringEncoding]; 
      NSLog(@"From server: %@",str); 
      [str release]; 
      [data release];   
      data = nil; 
      break; 
     } 
     case NSStreamEventErrorOccurred: 
     { 
      NSError *theError = [stream streamError]; 
      NSLog(@"Error reading stream! ,Error %i: %@",[theError code], [theError localizedDescription]); 
      [self disconnect]; 
      [self connectToServerUsingStream:kHostIP portNo:kPort]; 
      break; 
     } 
     case NSStreamEventHasSpaceAvailable: 
     { 
      if(stream == oStream && !isDataSent) 
      { 
       isDataSent = YES; 
       [self writeToServer:@"HI"]; 
      } 
      break; 
     } 
    } 
} 

Répondre

0

Quels messages de journalisation en êtes-vous vous pouvez donc voir quelles parties de votre code appelée?

Avez-vous essayé de définir des points d'arrêt puis de passer à l'étape suivante pour voir le point de défaillance exact et également inspecter les objets au cas où vous ne les retiendrez pas ou ne les relâcherez pas correctement?

Quelles autres mesures de débogage avez-vous déjà prises?

+0

merci à tous pour les réponses le problème était que la longueur des données du serveur après la désactivation est -1 et cela ne gère pas dans le cas 'NSStreamEventHasBytesAvailable' – someone

1

Vous devez probablement implémenter NSStreamEventEndEncountered case et fermer/libérer le flux.

0

Essayez d'ajouter les drapeaux de l'éditeur de liens suivants:

OTHER_LDFLAGS = -lz -lxml2 -ltidy -ObjC 

à votre projet.