XnStatus XnServerSession::ServeThread() { XnStatus nRetVal = XN_STATUS_OK; while (m_bShouldRun) { if (!m_ioStream.IsConnected()) { xnLogWarning(XN_MASK_SENSOR_SERVER, "Client %u socket was closed. Closing session...", m_nID); CloseSessionImpl(); break; } nRetVal = HandleSingleRequest(); if ((nRetVal != XN_STATUS_OK) && (nRetVal != XN_STATUS_OS_NETWORK_CONNECTION_CLOSED) && (nRetVal != XN_STATUS_OS_NETWORK_TIMEOUT)) { xnLogWarning(XN_MASK_SENSOR_SERVER, "Failed processing client request: %s", xnGetStatusString(nRetVal)); } } // We cannot RemoveClient from this thread (as part of it is to close the thread). Instead, signal that // client has stopped, and let server main thread wait for exit. m_bHasEnded = TRUE; return (XN_STATUS_OK); }
XnStatus XnServerSession::HandleCloseSession() { XnStatus nRetVal = XN_STATUS_OK; xnLogVerbose(XN_MASK_SENSOR_SERVER, "Received BYE from client %u", m_nID); XnStatus nActionResult = CloseSessionImpl(); // client shouldn't care if close succeeded or not. always send OK. nRetVal = SendReply(XN_SENSOR_SERVER_MESSAGE_BYE, XN_STATUS_OK); if (nRetVal != XN_STATUS_OK) { xnLogWarning(XN_MASK_SENSOR_SERVER, "Failed to send BYE reply to client %u: %s", m_nID, xnGetStatusString(nRetVal)); } return (XN_STATUS_OK); }