2016-04-02 4 views
0

Wie kann ein Server auf Mac OSX mit Objective C und Distributed Objects (IPC API) feststellen, ob der Client seine Anwendung geschlossen hat und somit der NSConnection-Zeiger unterbrochen wurde? Ich meine, ich könnte in einer while Schleife sein, viele Daten zu lesen, um vom Server an den Client zurückzusenden, und ich kann für Sachen testen, wenn ich nur wusste, was der Trick war zu bestimmen, ob der Client plötzlich getrennt hat.Testen verteilter Objektverbindungen in OSX mit Objective C

Antwort

0

Fügen Sie dies Ihrer Server-Vended-Objektklasse hinzu und überprüfen Sie sie dann, wenn Sie in irgendeiner Art von Schleife für längere Zeit etwas tun. Ersetzen Sie im folgenden Code den Begriff "Servicetest" durch den Namen Ihres tatsächlichen Prozesses. Sie können Ihre Client-App ausführen und dann ps -ef an der Befehlszeile überprüfen, um zu sehen, was Ihr Prozess ist, wenn Sie unsicher sind. Es wird das mit DerivedData sein, wenn es temporär in XCode läuft.

Eine kleine Warnung, obwohl. Diese Routine ist ziemlich schwer und sollte nicht bei jeder Schleifeniteration aufgerufen werden. Überprüfen Sie stattdessen etwa alle 500 Iterationen Ihrer while-Schleife, in der Sie sich befinden. Sie könnten auch einen Hintergrundtimer haben, der ausgeführt und überprüft wird. Oder Sie könnten Rand verwenden, um 1 in 5 Odds zu ermitteln und es dann auszuführen.

Beachten Sie, dass diese Routine nur ordnungsgemäß mit verteilten Objekten auf demselben System ausgeführt wird, wie in Anwendung zu IPC der Anwendung statt verteilten Objekten über ein LAN.

Also, wenn ich, dass ein Kunde plötzlich getrennt erkannt, kann ich ein break auf meiner while Schleife (wo ich langsam Prozessdaten lese) und tat dann ein pclose() an diesem Prozess, weil es keinen Sinn war es nicht mehr läuft.

/* requires these includes 
#include <libproc.h> 
#include <sys/sysctl.h> 
#include <string> 
*/ 

- (bool)_clientSuddenlyDisconnected; 
{ 

    int numberOfProcesses = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0); 
    pid_t pids[1024]; 
    bzero(pids, 1024); 
    proc_listpids(PROC_ALL_PIDS, 0, pids, sizeof(pids)); 
    for (int i = 0; i < numberOfProcesses; ++i) { 
      if (pids[i] == 0) { continue; } 
      char pathBuffer[PROC_PIDPATHINFO_MAXSIZE]; 
      bzero(pathBuffer, PROC_PIDPATHINFO_MAXSIZE); 
      proc_pidpath(pids[i], pathBuffer, sizeof(pathBuffer)); 
      if (strlen(pathBuffer) > 0) { 
        std::string sTest(pathBuffer); 
        sTest = "/" + sTest + "$$$"; 
        if (sTest.find("/servicetest$$$") != std::string::npos) { 
         return false; 
        } 
      } 
    } 
    return true; 
}