Frage

Ich schreibe eine Cocoa-Anwendung. Es gibt eine Steckdose in der Anwendung, und immer dann, wenn der Socket lesbar wird mag ich Daten aus der Steckdose lesen, die Daten verarbeiten und entsprechend aktualisiert die Benutzeroberfläche. Ich möchte das Leseereignis Prüfung in der Hauptschleife integrieren, das heißt ich die Buchse an der Hauptschleife anhängen möchten und die Hauptschleife Anruf einen Rückruf haben, wenn die Buchse wird lesbar.

Ich habe eine Testanwendung geschrieben, aber aus irgendeinem Grund ist es nicht funktioniert:

#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;
}

Die App sollte auf localhost Port 1234 hören, und wenn jemand eine Verbindung zum Server oder Daten an den Server sendet, wird die App soll „Haiz“ auf der Konsole drucken. Doch die App tut nichts. Die Buchse wird erstellt und kann ich Telnet auf Port 1234, aber die App nicht, etwas zu der Konsole gedruckt werden.

Was mache ich falsch?

War es hilfreich?

Lösung

Aus der Dokumentation:

  

Ein NSSocketPort Objekt kann als Endpunkt für verteilte Objektverbindungen verwendet werden.

Das ist nicht das, was Sie hier tun.

Sie möchten entweder NSFileHandle um einen Socket-Dateideskriptor von dem API-Buchsen BSD oder a CFSocket . So können Sie die Buchse auf der Flucht Schleife setzen.

Andere Tipps

Sie möchten NSSocketPort in der Art und Weise verwenden, Sie tun, aber dann eine NSFileHandle schaffen Verbindungen auf dem Sockel zu akzeptieren. Sie können Rückrufe auf dem Haupt-Thread zu bekommen wie Sie erwarten, zuerst für neue Verbindungen, und dann Daten auf diesen Verbindungen. Verwenden Sie diese O'Reilly Artikel und ignorieren einfach die HTTP-Zeug.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top