Nesne C ve Dağıtılmış Nesnelerle (IPC API) Mac OSX'te, bir istemci istemcinin uygulamayı kapatıp kapatmadığını ve NSConnection işaretçisinin bozuk olup olmadığını nasıl belirleyebilir? Yani, while
döngüsünde, sunucudan istemciye geri göndermek için çok fazla veri okuyor olabilirim ve istemcinin aniden bağlantısının kesildiğini belirlemek için hilenin ne olduğunu bilseydim bir şeyler test edebilirim.Hedef C ile OSX'te Dağıtılmış Nesne Bağlantılarının Test Edilmesi
cevap
Bunu sunucunuzun atıflı nesne sınıfına ekleyin ve daha sonra uzun bir süre için herhangi bir döngüde bir şey yaparken kontrol edin. Asıl işleminizin adı ile aşağıdaki kodda "servicetest" ifadesini değiştirin. İstemci uygulamanızı çalıştırabilir ve belirsiz ise işleminizin ne olduğunu görmek için komut satırında ps -ef
'u kontrol edebilirsiniz. XCode'da geçici olarak çalışıyorsa, DerivedData olanı olacaktır.
Yine de küçük bir uyarı. Bu rutin bir çeşit ağırdır ve her döngü yinelemesiyle çağırmamalısınız. Bunun yerine, örneğin, olabileceğiniz zaman döngüsünüzdeki her 500 yineleme gibi kontrol edin. Ayrıca çalışan ve kontrol eden bir arka plan zamanlayıcı da olabilir. Ya da rand'ı 5 ihtimalden birini belirlemek ve daha sonra çalıştırmak için kullanabilirsiniz.
Bu yordamın, bir LAN üzerinden Dağıtılmış Nesneler yerine, uygulama IPC uygulamasında olduğu gibi, aynı sistemdeki Dağıtılmış Nesnelerle yalnızca düzgün şekilde çalıştığını unutmayın. Bir istemci aniden kesildi algıladı zaman artık çalışan bir anlamı yoktu çünkü (ben yavaş bir süreç verilerinin okunması nerede) ve daha sonra bu süreci üzerinde pclose()
yaptılar
yani, ben benim while
döngü bir break
yok.
/* 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;
}