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

Posted

技术标签:

【中文标题】在 OSX 中使用 Objective C 测试分布式对象连接【英文标题】:Testing Distributed Object Connections in OSX with Objective C 【发布时间】:2016-04-02 06:32:12 【问题描述】:

在带有 Objective C 和分布式对象 (IPC API) 的 Mac OSX 上,服务器如何确定客户端是否关闭了他们的应用程序,从而导致 NSConnection 指针被破坏?我的意思是,我可能处于while 循环中,读取大量数据以从服务器发送回客户端,如果我知道确定客户端是否突然断开连接的诀窍是什么,我就可以进行测试.

【问题讨论】:

【参考方案1】:

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

不过,有点警告。这个例程有点重,你不应该在每次循环迭代时调用它。取而代之的是,例如,每隔 500 次循环检查您可能所处的循环。您还可以有一个运行和检查的后台计时器。或者您可以使用 rand 确定五分之一的赔率然后运行它。

请注意,此例程仅适用于同一系统上的分布式对象,如应用程序 IPC 中的应用程序,而不是 LAN 上的分布式对象。

所以,当我检测到客户端突然断开连接时,我在我的 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;

【讨论】:

以上是关于在 OSX 中使用 Objective C 测试分布式对象连接的主要内容,如果未能解决你的问题,请参考以下文章

将 Node.js+Socket.io 包装成 OSX 可执行文件的可靠方法? (或用作替代品的 C/C++/Objective-C 库)

Objective-C学习笔记

在Objective c程序(Xcode)中使用汇编代码

如何在 Objective C 中执行 chmod()

无法在快速单元测试中使用 Objective-C 类

使用 CMake 链接到可可库(C++ 与 Objective-C 混合)