使用 Objective C 在 OSX 中测试分布式对象连接
Testing Distributed Object Connections in OSX with Objective C
在 Mac OSX 与 Objective C 和分布式对象 (IPC API) 上,服务器如何确定客户端是否已关闭其应用程序,从而确定NSConnection 指针已损坏?我的意思是,我可能处于 while
循环中,读取大量数据以从服务器发送回客户端,如果我知道确定客户端是否有技巧,我就可以测试一些东西突然断线了。
将此添加到服务器的出售对象 class,然后在长时间循环执行任何操作时检查它。将下面代码中的 "servicetest" 短语替换为您实际进程的名称。您可以 运行 您的客户端应用程序,然后在命令行检查 ps -ef
以查看您的进程(如果不确定)。如果 运行ning 暂时在 XCode.
中,它将是带有 DerivedData 的那个
不过有点警告。这个例程有点繁重,您不应该在每次循环迭代时都调用它。相反,例如,每 500 次 while 循环迭代检查一次。您还可以有一个 运行 和检查的后台计时器。或者您可以使用 rand 来确定五分之一的赔率,然后 运行 它。
请注意,此例程仅 运行 在同一系统上适用于分布式对象,如应用程序 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;
}
在 Mac OSX 与 Objective C 和分布式对象 (IPC API) 上,服务器如何确定客户端是否已关闭其应用程序,从而确定NSConnection 指针已损坏?我的意思是,我可能处于 while
循环中,读取大量数据以从服务器发送回客户端,如果我知道确定客户端是否有技巧,我就可以测试一些东西突然断线了。
将此添加到服务器的出售对象 class,然后在长时间循环执行任何操作时检查它。将下面代码中的 "servicetest" 短语替换为您实际进程的名称。您可以 运行 您的客户端应用程序,然后在命令行检查 ps -ef
以查看您的进程(如果不确定)。如果 运行ning 暂时在 XCode.
不过有点警告。这个例程有点繁重,您不应该在每次循环迭代时都调用它。相反,例如,每 500 次 while 循环迭代检查一次。您还可以有一个 运行 和检查的后台计时器。或者您可以使用 rand 来确定五分之一的赔率,然后 运行 它。
请注意,此例程仅 运行 在同一系统上适用于分布式对象,如应用程序 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;
}