Question

J'écris une application Cocoa. Il y a une prise dans l'application, et chaque fois que la prise devient lisible je veux lire les données de la prise, traiter les données et mettre à jour l'interface utilisateur en conséquence. Je veux intégrer le contrôle des événements de lecture dans la boucle principale, à savoir que je veux fixer la prise à la boucle principale et que l'appel principal en boucle un rappel à chaque fois que la prise devient lisible.

J'ai écrit une application de test, mais pour une raison quelconque, il ne fonctionne pas:

#include <stdio.h>
#include <Foundation/NSAutoReleasePool.h>
#include <Foundation/NSRunLoop.h>
#include <Foundation/NSPort.h>

@interface MyDelegate : NSObject <NSPortDelegate> {
}
- (void)handlePortMessage:(NSPortMessage *)portMessage;
@end

@implementation MyDelegate
- (void)handlePortMessage:(NSPortMessage *)portMessage {
    printf("Haiz\n");
}
@end

int
main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSSocketPort *server = [NSSocketPort alloc];
    MyDelegate *foo = [MyDelegate alloc];
    [server initWithTCPPort: 1234];
    [server setDelegate: foo];
    [[NSRunLoop mainRunLoop] addPort: server forMode: NSDefaultRunLoopMode];
    [[NSRunLoop mainRunLoop] run];
    [pool release];
    return 0;
}

L'application est censé écouter sur le port localhost 1234, et chaque fois que quelqu'un se connecte au serveur ou envoie des données au serveur, l'application est censé imprimer « Haiz » sur la console. Cependant, l'application ne fait rien du tout. La prise est créé et je peux telnet sur le port 1234, mais l'application n'imprime rien à la console.

Qu'est-ce que je fais mal?

Était-ce utile?

La solution

De la documentation:

  

Un objet NSSocketPort peut être utilisé comme un point de terminaison pour des connexions d'objets distribués.

Ce n'est pas ce que vous faites ici.

Vous voulez soit NSFileHandle autour d'un descripteur de fichier socket de l'API sockets BSD, ou a CFSocket . Cela vous permettra de mettre la prise sur la boucle d'exécution.

Autres conseils

Vous voulez utiliser NSSocketPort de la manière que vous faites, mais créer un NSFileHandle pour accepter les connexions sur la prise. Vous pouvez obtenir callbacks sur le thread principal comme vous vous attendez, d'abord pour de nouvelles connexions, et pour les données sur les connexions. Utilisez cette O'Reilly article et ignorer les choses HTTP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top