void Server_ProtocolHandler::pingClockTimeout() { int cmdcountinterval = server->getCommandCountingInterval(); int msgcountinterval = server->getMessageCountingInterval(); int pingclockinterval = server->getClientKeepAlive(); int interval = server->getMessageCountingInterval(); if (interval > 0) { if(pingclockinterval > 0) { messageSizeOverTime.prepend(0); if (messageSizeOverTime.size() > (msgcountinterval / pingclockinterval)) messageSizeOverTime.removeLast(); messageCountOverTime.prepend(0); if (messageCountOverTime.size() > (msgcountinterval / pingclockinterval)) messageCountOverTime.removeLast(); } } interval = server->getCommandCountingInterval(); if (interval > 0) { if (pingclockinterval > 0) { commandCountOverTime.prepend(0); if (commandCountOverTime.size() > (cmdcountinterval / pingclockinterval)) commandCountOverTime.removeLast(); } } if (timeRunning - lastDataReceived > server->getMaxPlayerInactivityTime()) prepareDestroy(); if (!userInfo || QString::fromStdString(userInfo->privlevel()).toLower() == "none") { if ((server->getIdleClientTimeout() > 0) && (idleClientWarningSent)) { if (timeRunning - lastActionReceived > server->getIdleClientTimeout()) { prepareDestroy(); } } if (((timeRunning - lastActionReceived) >= ceil(server->getIdleClientTimeout() *.9)) && (!idleClientWarningSent) && (server->getIdleClientTimeout() > 0)) { Event_NotifyUser event; event.set_type(Event_NotifyUser::IDLEWARNING); SessionEvent *se = prepareSessionEvent(event); sendProtocolItem(*se); delete se; idleClientWarningSent = true; } } ++timeRunning; }
void Server_ProtocolHandler::pingClockTimeout() { int cmdcountinterval = server->getCommandCountingInterval(); int msgcountinterval = server->getMessageCountingInterval(); int pingclockinterval = server->getPingClockInterval(); int interval = server->getMessageCountingInterval(); if (interval > 0) { if(pingclockinterval > 0) { messageSizeOverTime.prepend(0); if (messageSizeOverTime.size() > (msgcountinterval / pingclockinterval)) messageSizeOverTime.removeLast(); messageCountOverTime.prepend(0); if (messageCountOverTime.size() > (msgcountinterval / pingclockinterval)) messageCountOverTime.removeLast(); } } interval = server->getCommandCountingInterval(); if (interval > 0) { if (pingclockinterval > 0) { commandCountOverTime.prepend(0); if (commandCountOverTime.size() > (cmdcountinterval / pingclockinterval)) commandCountOverTime.removeLast(); } } if (timeRunning - lastDataReceived > server->getMaxPlayerInactivityTime()) prepareDestroy(); ++timeRunning; }
Servatrice::~Servatrice() { gameServer->close(); // clients live in other threads, we need to lock them clientsLock.lockForRead(); for (int i = 0; i < clients.size(); ++i) QMetaObject::invokeMethod(clients.at(i), "prepareDestroy", Qt::QueuedConnection); clientsLock.unlock(); // client destruction is asynchronous, wait for all clients to be gone bool done = false; class SleeperThread : public QThread { public: static void msleep(unsigned long msecs) { QThread::usleep(msecs); } }; do { SleeperThread::msleep(10); clientsLock.lockForRead(); if (clients.isEmpty()) done = true; clientsLock.unlock(); } while (!done); prepareDestroy(); }
LocalServer::~LocalServer() { // LocalServer is single threaded so it doesn't need locks on this while (!clients.isEmpty()) clients.first()->prepareDestroy(); prepareDestroy(); }
void Server_ProtocolHandler::pingClockTimeout() { int interval = server->getMessageCountingInterval(); if (interval > 0) { messageSizeOverTime.prepend(0); if (messageSizeOverTime.size() > server->getMessageCountingInterval()) messageSizeOverTime.removeLast(); messageCountOverTime.prepend(0); if (messageCountOverTime.size() > server->getMessageCountingInterval()) messageCountOverTime.removeLast(); } if (timeRunning - lastDataReceived > server->getMaxPlayerInactivityTime()) prepareDestroy(); ++timeRunning; }
void ServerSocketInterface::readClient() { QByteArray data = socket->readAll(); servatrice->incRxBytes(data.size()); inputBuffer.append(data); do { if (!messageInProgress) { if (inputBuffer.size() >= 4) { messageLength = (((quint32) (unsigned char) inputBuffer[0]) << 24) + (((quint32) (unsigned char) inputBuffer[1]) << 16) + (((quint32) (unsigned char) inputBuffer[2]) << 8) + ((quint32) (unsigned char) inputBuffer[3]); inputBuffer.remove(0, 4); messageInProgress = true; } else return; } if (inputBuffer.size() < messageLength) return; CommandContainer newCommandContainer; newCommandContainer.ParseFromArray(inputBuffer.data(), messageLength); inputBuffer.remove(0, messageLength); messageInProgress = false; // dirty hack to make v13 client display the correct error message if (handshakeStarted) processCommandContainer(newCommandContainer); else if (!newCommandContainer.has_cmd_id()) { handshakeStarted = true; if (!initSession()) prepareDestroy(); } // end of hack } while (!inputBuffer.isEmpty()); }
Servatrice::~Servatrice() { gameServer->close(); prepareDestroy(); }
LocalServer::~LocalServer() { prepareDestroy(); }
void ServerSocketInterface::catchSocketError(QAbstractSocket::SocketError socketError) { qDebug() << "Socket error:" << socketError; prepareDestroy(); }
void ServerSocketInterface::readClient() { QByteArray data = socket->readAll(); servatrice->incRxBytes(data.size()); inputBuffer.append(data); do { if (!messageInProgress) { if (inputBuffer.size() >= 4) { messageLength = (((quint32) (unsigned char) inputBuffer[0]) << 24) + (((quint32) (unsigned char) inputBuffer[1]) << 16) + (((quint32) (unsigned char) inputBuffer[2]) << 8) + ((quint32) (unsigned char) inputBuffer[3]); inputBuffer.remove(0, 4); messageInProgress = true; } else return; } if (inputBuffer.size() < messageLength) return; CommandContainer newCommandContainer; try { newCommandContainer.ParseFromArray(inputBuffer.data(), messageLength); } catch(std::exception &e) { qDebug() << "Caught std::exception in" << __FILE__ << __LINE__ << #ifdef _MSC_VER // Visual Studio __FUNCTION__; #else __PRETTY_FUNCTION__; #endif qDebug() << "Exception:" << e.what(); qDebug() << "Message coming from:" << getAddress(); qDebug() << "Message length:" << messageLength; qDebug() << "Message content:" << inputBuffer.toHex(); } catch(...) { qDebug() << "Unhandled exception in" << __FILE__ << __LINE__ << #ifdef _MSC_VER // Visual Studio __FUNCTION__; #else __PRETTY_FUNCTION__; #endif qDebug() << "Message coming from:" << getAddress(); } inputBuffer.remove(0, messageLength); messageInProgress = false; // dirty hack to make v13 client display the correct error message if (handshakeStarted) processCommandContainer(newCommandContainer); else if (!newCommandContainer.has_cmd_id()) { handshakeStarted = true; if (!initSession()) prepareDestroy(); } // end of hack } while (!inputBuffer.isEmpty()); }
Servatrice::~Servatrice() { prepareDestroy(); QSqlDatabase::database().close(); }