2010-04-06 4 views
0

Je parviens (apparemment) à établir une connexion ftp, mais je ne parviens pas à en lire quelque chose, et pour cause: je n'atteins la lecture que lorsque la connexion a expiré.Cocoa Lire NSInputStream à partir de la connexion FTP

Voici mon code:

tête:

NSInputStream *iStream; 
NSOutputStream *oStream; 

mise en œuvre:

 NSHost *host = [NSHost hostWithAddress:@"127.0.0.1"]; 
     [iStream open]; // SOLUTION changes 
     [NSStream getStreamsToHost:host port:3333 inputStream:&iStream outputStream:&oStream]; 

     NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:1]; 
     [settings setObject:(NSString *)NSStreamSocketSecurityLevelTLSv1 forKey:(NSString *)kCFStreamSSLLevel]; 
     [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot]; 
     [settings setObject:@"127.0.0.1" forKey:(NSString *)kCFStreamSSLPeerName]; 

     /*[iStream retain]; 
     [iStream setDelegate:self]; 
     [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     CFReadStreamSetProperty((CFReadStreamRef)iStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings); 
     [iStream setProperty:NSStreamSocketSecurityLevelTLSv1 forKey:NSStreamSocketSecurityLevelKey];*/ 
     //[iStream open]; SOLUTION changes: moved up 

Pour eventhandling j'utiliser, basé sur http://www.cocoadev.com/index.pl?NSStream:

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode 
{ 
    if (aStream == iStream) { 
     [self handleInputStreamEvent:eventCode]; 
    } else if (aStream == oStream) { 
     [self handleOutputStreamEvent:eventCode]; 
    } 
} 
- (void)handleInputStreamEvent:(NSStreamEvent)eventCode 
{ 
    switch (eventCode) { 
    // SOLUTION changes: new inputstream handler 
    case NSStreamEventHasBytesAvailable: 
     if(!_data) { 
      _data = [[NSMutableData data] retain]; 
     } 
     uint8_t buf[1024]; 
     unsigned int len = 0; 
     len = [(NSInputStream *)iStream read:buf maxLength:1024]; 
     if(len) { 
      [_data appendBytes:(const void *)buf length:len]; 
      [bytesRead setIntValue:[bytesRead intValue]+len]; 
     } 
     [self readBytes]; 
     break; 
    case NSStreamEventOpenCompleted: 
     NSLog(@"NSStreamEventOpenCompleted"); 
     break; 
    case NSStreamEventEndEncountered: 
     NSLog(@"NSStreamEventEndEncountered"); 
     break; 
    case NSStreamEventErrorOccurred: 
     NSLog(@"An error occurred on the input stream."); 
     break; 
    } 
} 

J'ai quitté la configuration oStream de ce post pour le garder minimal.

Je n'ai pas encore envoyé de requête au FTP pour passer à SSL.

Toute aide est grandement appréciée car je trouve que Xcode est assez horrible pour le débogage (aucune exception ou message d'erreur sur les actions échouées quoi que ce soit).

  • Chuck

Répondre

0

Voir Polling Versus Run-Loop Scheduling. Notez le mot clé par rapport au.

De plus, je ne pense pas qu'il soit juste de blâmer les capacités de débogage de Xcode. Xcode est l'IDE et fonctionne plutôt bien pour le débogage. L'API est ce qui devrait lever des exceptions (ou renvoyer nul) quand quelque chose se passe mal et je n'ai jamais eu de problème pour définir un point d'arrêt sur objc_exception_throw() ou -[NSException raise] pour attraper des exceptions pendant mes sessions de débogage. Un autre point à prendre en compte: Vous n'avez aucun code de sécurité de quelque nature que ce soit. Cela signifie que vous ignorez la possibilité qu'une connexion ne soit pas établie avec succès. Une partie de la détection des erreurs consiste à s'assurer que votre propre code détecte et gère les échecs, en particulier lorsque des communications réseau sont impliquées.

+0

Merci pour le lien. Et des points valides sur mon, ce qui semblait être une attaque sur xcode. Cependant, mon mélange d'interrogation est seulement quand je lis. Sans doute c'est une erreur, et je l'ai enlevé, je n'ai toujours pas de réponse que le flux a des octets disponibles. Je peux confirmer qu'une connexion est faite, car je peux voir le côté serveur qu'il se connecte, et le serveur envoie un message "220" (ftp) hello. – James

+0

- flux (vide): (NSStream *) aStream handleEvent: (NSStreamEvent) code_événement { if (aStream == iStream) { [self handleInputStreamEvent: eventCode]; } else if (aStream == oStream) { [self handleOutputStreamEvent: code d'événement]; }} - (void) handleInputStreamEvent: (NSStreamEvent) eventCode {commutateur (eventCode) { cas NSStreamEventHasBytesAvailable: [self readBytes]; pause; } } est ce que j'ai configuré pour gérer les événements de flux – James

+0

Il est préférable de mettre à jour le message d'origine avec le code approprié. Le code n'est pas formaté dans les commentaires. Vous devriez certainement mettre à jour la liste de code dans votre question originale pour plus de clarté. –

Questions connexes