bool O2Client:: Stop(void) { if (!Active) return false; Active = false; ConnectSessionLock.Lock(); { for (O2SocketSessionPSetIt ssit = connectss.begin(); ssit != connectss.end(); ssit++) closesocket((*ssit)->sock); } ConnectSessionLock.Unlock(); SessionListLock.Lock(); { for (O2SocketSessionPListIt ssit = sss.begin(); ssit != sss.end(); ssit++) closesocket((*ssit)->sock); } SessionListLock.Unlock(); QueueExistSignal.On(); SessionExistSignal.On(); HANDLE handles[2] = { LaunchThreadHandle, NetIOThreadHandle }; WaitForMultipleObjects(2, handles, TRUE, INFINITE); CloseHandle(LaunchThreadHandle); CloseHandle(NetIOThreadHandle); LaunchThreadHandle = 0; NetIOThreadHandle = 0; while (1) { ConnectSessionLock.Lock(); size_t n = connectss.size(); ConnectSessionLock.Unlock(); if (n == 0) break; Sleep(THREAD_ALIVE_WAIT_MS); } OnClientStop(); if (Logger) Logger->AddLog(O2LT_INFO, ClientName.c_str(), 0, 0, L"停止"); return true; }
bool O2Client:: Stop(void) { if (!Active) return false; Active = false; ConnectSessionLock.Lock(); { for (O2SocketSessionPSetIt ssit = connectss.begin(); ssit != connectss.end(); ssit++) { #ifdef _WIN32 /** winsock */ closesocket((*ssit)->sock); #else /** bsd socket */ close((*ssit)->sock); #endif } } ConnectSessionLock.Unlock(); SessionListLock.Lock(); { for (O2SocketSessionPListIt ssit = sss.begin(); ssit != sss.end(); ssit++) { #ifdef _WIN32 /** winsock */ closesocket((*ssit)->sock); #else /** bsd socket */ close((*ssit)->sock); #endif } } SessionListLock.Unlock(); QueueExistSignal.On(); SessionExistSignal.On(); #ifdef _WIN32 /** win32 thread */ HANDLE handles[2] = { LaunchThreadHandle, NetIOThreadHandle }; WaitForMultipleObjects(2, handles, TRUE, INFINITE); CloseHandle(LaunchThreadHandle); CloseHandle(NetIOThreadHandle); LaunchThreadHandle = 0; NetIOThreadHandle = 0; #else /** POSIX thrad */ neosmart::WaitForMultipleEvents(handles, 2, TRUE, DosMocking::INFINITE); neosmart::DestroyEvent(handles[0]); neosmart::DestroyEvent(handles[1]); LaunchThreadHandle = 0; NetIOThreadHandle = 0; #endif while (1) { ConnectSessionLock.Lock(); size_t n = connectss.size(); ConnectSessionLock.Unlock(); if (n == 0) break; Sleep(THREAD_ALIVE_WAIT_MS); } OnClientStop(); if (Logger) Logger->AddLog(O2LT_INFO, ClientName.c_str(), 0, 0, L"停止"); return true; }