Domanda

Sto scrivendo un'applicazione Cocoa. V'è una presa in applicazione, e ogni volta che la presa diventa leggibile voglio leggere i dati dal socket, elaborare i dati e aggiornare l'interfaccia utente di conseguenza. Voglio integrare il controllo evento di lettura nel ciclo principale, vale a dire che voglio collegare la presa per il ciclo principale ed avere la chiamata ciclo principale una richiamata ogni volta che presa diventa leggibile.

Ho scritto un'applicazione di test, ma per qualche ragione non funziona:

#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'applicazione si suppone per l'ascolto su localhost porta 1234, e ogni volta che qualcuno si connette al server o invia i dati al server, l'applicazione si suppone che la stampa "Haiz" sulla console. Tuttavia l'applicazione non fa niente per niente. Il socket è creato e posso telnet alla porta 1234, ma l'applicazione non stampa nulla alla console.

Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Dalla documentazione:

  

Un oggetto NSSocketPort può essere utilizzato come un endpoint per le connessioni oggetti distribuiti.

Non è quello che stai facendo qui.

Si desidera NSFileHandle intorno ad un descrittore di file presa dal socket BSD API, o un CFSocket . Questo vi permetterà di mettere la presa sul loop di esecuzione.

Altri suggerimenti

Si desidera utilizzare NSSocketPort nel modo che stai facendo, ma poi creare un NSFileHandle per accettare connessioni sul socket. È possibile ottenere callback sul thread principale, proprio come ci si aspetta, prima per le nuove connessioni, e poi per i dati su tali collegamenti. Utilizzare questo O'Reilly articolo e semplicemente ignorare la roba HTTP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top