void dispatchMessage(ClientsContainer * container, Buffer * message, int senderId) { for(int i = 0 ; i < container->list->getSize() ; i++) { if(i != senderId) { logger.printDebug("dispatching ..."); if(sendBuffer(container->list->get(i)->socket,message)) { logger.printLog("Client disconnected !"); killClient(container,i); } } } }
BtsSpawnClient::BtsSpawnClient(QObject *parent) :BtsClient(parent) { p = new BtsSpawnClient_private(); p->autorestart = false; p->cur_port = 0; p->host = "127.0.0.1"; randomize(); p->clientProc = nullptr; p->forceKillTimer = new QTimer(this); p->forceKillTimer->setSingleShot(true); p->forceKillTimer->setInterval(2500); connect(p->forceKillTimer, SIGNAL(timeout()), this, SLOT(killClient())); }
void checkForInputs(CheckDataSet data) { Buffer workExchangeBuffer; // use a copy to keep the size workExchangeBuffer.pointer = data.exchangeBuffer->pointer; while(1) { data.container->containerMutex->lock(); data.container->selector->wait(sf::milliseconds(100)); // waits for data, 100ms timeout (give a chance to unlock other threads) for(int i = 0 ; i < data.container->list->getSize() ; i++) { if(data.container->list->get(i)->isReady && data.container->selector->isReady(*data.container->list->get(i)->socket)) { if(receiveBuffer(data.container->list->get(i)->socket,&workExchangeBuffer,data.exchangeBuffer->size)) { logger.printLog("Client disconnected !"); killClient(data.container,i); } if(workExchangeBuffer.size > 0) { logger.printDebug("Got data, dispatching"); dispatchMessage(data.container,&workExchangeBuffer,i); } } } data.container->containerMutex->unlock(); if(checkStopThreads()) { return; } sf::sleep(sf::milliseconds(1)); // give time for the other threads } }
void killClientMutexed(ClientsContainer * container, int id) { container->containerMutex->lock(); killClient(container,id); container->containerMutex->unlock(); }