Objective C と Distributed Objects (IPC API) を使用する Mac OSX では、クライアントがアプリケーションを閉じて NSConnection ポインタが壊れているかどうかをサーバーはどのように判断できますか? つまり、サーバーからクライアントに送り返すために大量のデータを読み取ってループしている可能性がありwhile
、クライアントが突然切断されたかどうかを判断するためのトリックが何であるかを知っていれば、何かをテストできます。
1 に答える
これをサーバーの vended オブジェクト クラスに追加し、何らかの種類のループで長時間何かを実行するときにチェックします。以下のコードの「servicetest」句を実際のプロセスの名前に置き換えます。クライアント アプリを実行ps -ef
し、コマンド ラインでチェックして、不明な場合はプロセスを確認できます。XCode で一時的に実行する場合は、DerivedData を持つものになります。
ただし、少し警告します。このルーチンはちょっと重いので、ループの繰り返しごとに呼び出すべきではありません。代わりに、たとえば、while ループの 500 回の反復ごとに確認してください。実行してチェックするバックグラウンド タイマーを設定することもできます。または、rand を使用して 5 分の 1 のオッズを決定し、それを実行することもできます。
このルーチンは、LAN 上の分散オブジェクトではなく、アプリケーション間 IPC のように、同じシステム上の分散オブジェクトでのみ適切に実行されることに注意してください。
そのため、クライアントが突然切断されたことを検出したときbreak
、while
ループ (低速のプロセス データを読み取っていた場所) を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;
}