NSConnection - NSPortCoder timed out

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSConnection - NSPortCoder timed out

    Hallo zusammen,

    ich habe ein Problem mit meiner Verbindung zweier Programme über Distriubted Objects:

    Zum einen starte ich in meiner Server-Applikation eine Connection mit folgendem Code:


    NSSocketPort* receivePort = [[NSSocketPort alloc] initWithTCPPort:1234];
    NSSocketPort* sendPort = [[NSSocketPort alloc] initWithTCPPort:1235];

    NSConnection* connection = [[NSConnection alloc] initWithReceivePort:receivePort sendPort:sendPort];
    [connection setRootObject:self];


    Außerdem erzeuge ich in meiner Client-Applikation eine Verbindung zum Server:

    NSSocketPort* receivePort = [[NSSocketPort alloc] initWithTCPPort:1235];
    NSSocketPort* sendPort = [[NSSocketPort alloc] initWithTCPPort:1234];

    NSConnection* connection = [[NSConnection alloc] initWithReceivePort:receivePort sendPort:sendPort];


    Ich habe also die Ports beim Client entsprechend den Server-Ports umgedreht. So wie ich die Apple-Doku verstehe, sollte dies wunderbar funktionieren.(NSConnection Doku).
    Wenn ich allerdings den Client starte bekomme ich keine Verbindung. Meine connection ist immer nil.
    Die einzige Möglichkeit die funktioniert ist wenn ich den Send-Port des Servers, sowie den Receive-Port des Clients auf nil setze und die Ports des Clients mit initRemoteWithTCPPort:host: erzeuge. (Beide Programme laufen lokal)
    Erzeuge ich die Ports mit initRemoteWithTCPPort:host: und verwende beim Server als auch beim Client send und receive Ports bekomme ich folgende Exception sobald ich auf den Proxy zugreifen will:

    NSPortCoder sendBeforeTime:sendReplyPort:] timed out


    Ich denke jedoch, dass meine oben gezeigte Methode ebenfalls funktionieren sollte und performanter ist, da ich ja bidirektional kommunizieren möchte. Kann mir hier jemand helfen?
  • NSconnections senden immer bidirektional sie spawnen "tochterconnections" und handeln dann entsprechend die ports selbstätig aus

    btw kannst du wenn du lokal bleibst auch machports verwenden bzw die sehr übersichtliche variante mittels eines portnameservers dann brauchst du dich um die ports gar nicht zu kümmern sondern registrierst einfach nur deinen server
    snafu
    :() { :|: &};:
    sometimes i dream in hex
    Obey gravity! Because its a law!
  • Ok, das wäre ein Workaround. Danke dafür!
    Allerdings würde mich dennoch interessieren, warum es mit beiden Ports nicht funktioniert. Kann es sein, dass ich <NSCoding> implementieren muss, damit der PortCoder weiß, was er verschicken soll? Dachte eigentlich, dass dies nur bei den objekten notwendig ist, die als Parameter übergeben werden. Beim Proxy-Objekt der Verbindung sollte dies doch keine Rolle spielen?!?
  • Das kann so auch nicht funktionieren. initWithTCPPort: erstellt einen Server-Socket, initRemoteWithTCPPort:host: erstellt einen Client-Socket. Man braucht immer einen Server- und einen Client-Socket, damit Kommunikation möglich ist, auch wenn beide auf dem selbem Host laufen.
  • Also ich starte die Server-Verbindung so:


    NSSocketPort* receivePort = [[NSSocketPort alloc] initWithTCPPort:1234];
    NSSocketPort* sendPort = [[NSSocketPort alloc] initWithTCPPort:1235];
    NSConnection* connection = [[NSConnection alloc]initWithReceivePort:receivePort sendPort:sendPort];
    [connection setRootObject:self];


    Die Verbindung vom Client zum Server stelle ich folgendermaßen her:


    NSSocketPort* receivePort = [[NSSocketPort alloc] initRemoteWithTCPPort:1235 host:@"127.0.0.1"]
    NSSocketPort* sendPort = [[NSSocketPort alloc] initRemoteWithTCPPort:1234 host:@"127.0.0.1"];

    NSConnection* connection = [[NSConnection alloc] initWithReceivePort:receivePort sendPort:sendPort];


    So weit so gut... die connection im client scheint auf den ersten Blick ok zu sein. Also != nil... Sobald ich aber auf den Proxy zugreifen will bekomme ich eine Exception:

    id server = [[connection rootProxy] retain];

    Output:
    [NSPortCoder sendBeforeTime:sendReplyPort:] timed out


    Wie gesagt... diese Exception kommt nur wenn ich beide Ports verwende, was ja theoretisch funktionieren sollte. Setze ich beim server den Send-Port auf nil, und im Client den Receive-Port auf nil, klappt es wunderbar. Allerdings würde ich gern beide Ports verwenden, da ich eben denke dass dies performanter ist...
  • halt dich doch an apples beispiele...

    imho funktioniert das was du da tust schon gar nicht weil du den port nicht doppelt an bind() angehängt bekommst - desterhalb auch der timeout in dem moment wenn du NSconnection gestartet wird - das passiert erst in dem moment wenn du einen rootProxy setzt bzw ihn verwenden willst

    aber das eigntliche ist das du das überhaupt nicht brauchst!

    das hier im server

    Quellcode

    1. NSSocketPort * rPort = [[NSSocketPort alloc] initWithTCPPort:SERVERLOGINPORT];
    2. _networkUplink = [NSConnection connectionWithReceivePort:rPort sendPort:nil];
    3. [_networkUplink setDelegate:self];
    4. [_networkUplink retain];
    5. [_networkUplink setRootObject:self];


    eventuell registrierst du dich auch für die Notifications aber idr benutz ich perönlich gern die delegates

    das dann entsprechend im client:

    Quellcode

    1. NSSocketPort * sendPort = [[NSSocketPort alloc] initRemoteWithTCPPort:SERVERLOGINPORT host:SERVERHOST];
    2. _serverUplink = [NSConnection connectionWithReceivePort:nil sendPort:sendPort];
    3. _serverProxy = [[_serverUplink rootProxy] retain];
    4. if (!_serverProxy) {
    5. NSLog(@"no root proxy");
    6. exit(EXIT_FAILURE);
    7. }
    8. [_serverProxy setProtocolForProxy:@protocol(MyNetworkProtocol)];


    und mach dir keinerlei gedanken mehr um bidirektionalität
    die NSConnection Klasse handhabt das ganz allein

    du kannst zum beispiel einen Observer auf NSConnectionDidInitializeNotification registieren und dir dort anschauen das für jeden Proxy den du übern den rootPrxy ansprichst entsprechend Connections auf und je nach dem auch abgebaut werden

    du kannst btw mittels lsof überprüfen welche sendports der server automatisch für jeden client eröffnet und vis versa der cleint
    snafu
    :() { :|: &};:
    sometimes i dream in hex
    Obey gravity! Because its a law!