2009-04-10 6 views
3

Avertissement: Je suis un Noob Xcode/iPhone SDK. Je tente d'établir une connexion TCP/IP côté client à un serveur existant. Lors de la connexion, je m'attends à recevoir des données sur le serveur (version, etc.).iPhone SDK - NSStreamEventHasBytesAvailable/appendBytes: crash

Lorsque ma connexion est établie, l'événement NSStreamEventOpenCompleted se déclenche, donc je sais que la connexion est établie. Ensuite, les événements NSStreamEventHasBytesAvailable se déclenchent et j'exécute le code suivant. La valeur 71 (int) est stockée en len, ce que je crois est correct. Cependant, la ligne

[data appendBytes:&buffer length:len]; 

se bloque (je pense). Il n'y a pas d'erreur réelle jeté mais je ne vois __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__ même si j'ai erreur clairement ajouté attrapant:

case NSStreamEventHasBytesAvailable: 
    { 
     NSMutableData *data=[[NSMutableData alloc] init]; 

     uint8_t *buffer[1024]; 
     unsigned int len=0; 

     len=[(NSInputStream *)stream read:buffer maxLength:1024]; 
     if(len>0){ 
      @try{ 
       [data appendBytes:&buffer length:len]; 
      } 
      @catch(NSException *ex){ 
       NSLog(@"Fail: %@", ex); 
      } 
      [statusLabel setText:[data stringValue]]; 
      //[bytesRead setIntValue:[bytesRead intValue]+len]; 
     }else{ 
      NSLog(@"No Buffer"); 
     } 
     break ; 
    } 
+0

+1 belle question spécifique, avec un échantillon de code ... il est facile et amusant pour les gens d'aider –

Répondre

7

Déclarez votre tampon comme:

uint8_t buffer[1024]; 

et faire l'append comme:

[data appendBytes:buffer length:len]; 
+0

Je pense que la seule différence entre votre code et le mien est le "&" avant l'objet tampon dans l'appel appendBytes . Est-ce que je manque quelque chose d'autre? J'ai essayé les deux façons, et la même chose arrive. – Dutchie432

+0

OIC! Je l'ai. Merci beaucoup. Il suffit maintenant de comprendre comment convertir le tableau d'octets en NSString. Merci beaucoup!! – Dutchie432

+0

Examinez [[NSString alloc] initWithData: encodage de données: NSUTF8StringEncoding] et relâchez-le lorsque vous avez terminé. –

10

Ceci est un problème au niveau C: vous êtes confus au sujet des tampons et des pointeurs.

Ce code:

uint8_t *buffer[1024]; 

vous donne une mémoire tampon de la pile de 1024 pointeurs vers uint8_t s, ce qui est presque certainement pas ce que vous voulez. Au lieu de cela:

uint8_t buffer[1024]; 

Plus tard, vous passez l'adresse de votre pointeur sur la pile à - [NSMutableData appendBytes: longueur:], ce qui à nouveau n'est pas ce que vous voulez: comme dans the documentation, passer le premier élément :

[data appendBytes:buffer length:len]; 

il y a un very thorough programming guide avec le code complet pour ce que vous essayez de faire, vous pouvez faire référence.

Comme pour __TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION__, la corruption de mémoire et le mauvais pointeur de déréférencement n'est pas quelque chose que vous pouvez attraper avec un Objective-C @try/@catch; c'est beaucoup plus bas niveau. D'un autre côté, vous pouvez toujours l'attraper dans le débogueur si vous activez le débogage.

+0

Merci beaucoup pour votre explication détaillée. En tant que programmeur de PC (vb et .net), vous pouvez imaginer comment cela pourrait être écrasant pour un programmeur XCode de 3 jours. :) C'est très rafraîchissant d'obtenir une réponse détaillée, non-snobby. :) Quand je reçois le représentant, je vais voter vos réponses. – Dutchie432

+0

+1 pour l'élaboration de la solution avec autant de détails –

2

Par souci d'exhaustivité, read:maxLength: renvoie un NSInteger et sera négatif en cas d'erreur. L'assigner à un int non signé défausse ceci et peut causer un crash.

+0

Noté. Je vous remercie. – Dutchie432