用Objective C测试OSX中的分布式对象连接



在带有Objective C和分布式对象(IPC API)的Mac OSX上,服务器如何确定客户端是否关闭了其应用程序,因此NSConnection指针已断开?我的意思是,我可能处于while循环中,读取大量数据从服务器发送回客户端,如果我知道确定客户端是否突然断开连接的诀窍,我就可以测试这些数据。

将其添加到服务器的供应商对象类中,然后在长时间执行任何类型的循环时对其进行检查。将下面代码中的"servicetest"短语替换为实际进程的名称。如果不确定,您可以运行客户端应用程序,然后在命令行检查ps -ef,看看您的流程是什么。如果在XCode中临时运行,它将是带有DerivedData的。

不过,这是一个小小的警告。这个例程有点重,不应该每次循环迭代都调用它。相反,例如,检查while循环的每500次迭代。你也可以有一个后台计时器来运行和检查。或者你可以用兰特来确定五分之一的赔率,然后运行它。

请注意,此例程仅与同一系统上的分布式对象(如应用程序到应用程序IPC)一起正常运行,而不是与局域网上的分布式物体一起正常运行。

因此,当我检测到一个客户端突然断开连接时,我在while循环上做了一个break(我正在读取缓慢的进程数据),然后在该进程上做了pclose(),因为运行它已经没有意义了。

/* 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;
}

最新更新