MyTCPServerConnection(MyTCPServerConnectionFactory &factory, const Poco::Net::StreamSocket &socket): Poco::Net::TCPServerConnection(socket), _factory(factory), _handler(Pothos::RemoteHandler(socket.peerAddress().host().toString())) { _factory.connectionStart(); }
Session(Poco::Net::StreamSocket& socket, Poco::Net::SocketReactor& reactor) : m_socket(socket), m_reactor(reactor) { m_peerAddress = socket.peerAddress().toString(); std::cout << "connection from " << m_peerAddress << " ..." << std::endl; m_reactor.addEventHandler(m_socket, Poco::Observer<Session, Poco::Net::ReadableNotification>(*this, &Session::onReadable)); }
ChatServerHandler::ChatServerHandler(Poco::Net::StreamSocket& socket, Poco::Net::SocketReactor& reactor): _socket(socket), _reactor(reactor) { Poco::Util::Application& app = Poco::Util::Application::instance(); app.logger().information("Connection from " + socket.peerAddress().toString()); _reactor.addEventHandler(_socket, Poco::NObserver<ChatServerHandler, Poco::Net::ReadableNotification>(*this, &ChatServerHandler::onReadable)); _reactor.addEventHandler(_socket, Poco::NObserver<ChatServerHandler, Poco::Net::ShutdownNotification>(*this, &ChatServerHandler::onShutdown)); sendBroadcastMesage("[system]", _socket.peerAddress().toString() + " connected.\n"); clients.push_back(socket); }
/*! Get the peer socket address \return peer socket address reference */ Poco::Net::SocketAddress get_peer_socket_address() const { return _sock->peerAddress(); }
void AcceptThread::run() { Poco::Net::StreamSocket StrmSock; #ifndef _DEBUG string sNewConnectionIP; vector<std::pair<string,Poco::Timestamp::TimeDiff>> vConnections,vBannedIPs; vector< std::pair< string, /* IP */ std::pair< Timestamp::TimeDiff, /* Ban time */ Timestamp::TimeDiff /* Entry reset */ > > > vBanLenght; Poco::Stopwatch Timer; Poco::Timestamp::TimeDiff lowest,actual; int x,i; short iCount; bool fExit; Timer.start(); #endif _iThreadStatus = FC_THREADSTATUS_RUNNING; while(_iThreadStatus==FC_THREADSTATUS_RUNNING) { try { _ServerSock.listen(); StrmSock = _ServerSock.acceptConnection(); #ifndef _DEBUG cutOffPort(StrmSock.peerAddress().toString(),sNewConnectionIP); /* Check banlist */ if (!vBannedIPs.empty()) { actual = (Timer.elapsed()/1000); fExit = false; for (x=vBannedIPs.size()-1;x>=0;x--){ if (vBannedIPs[x].first.compare(sNewConnectionIP) != 0) {continue;} i = search(vBanLenght,sNewConnectionIP); if (actual - vBannedIPs[x].second >= vBanLenght[i].second.first) { /* Ban timed out */ /* Remove from connection list */ if (!vConnections.empty()){ for (i=vConnections.size()-1;i>=0;i--) { if (vConnections[i].first.compare(vBannedIPs[x].first) == 0){vConnections.erase(vConnections.begin()+i);} } } vBannedIPs.erase(vBannedIPs.begin()+x); /* Remove from banlist */ continue; } if (vBannedIPs[x].first.compare(sNewConnectionIP) == 0) { StrmSock.close(); fExit = true; break; } } if (fExit) {continue;} } /* Remove old banlenght entries */ if (!vBanLenght.empty()) { for (x = vBanLenght.size()-1;x>=0;x--) { if (vBanLenght[x].second.second < Timer.elapsed()/1000) { /* last ban was for 5 minutes -> remove it*/ vBanLenght.erase( vBanLenght.begin()+x); } } } /* Manage connection list + ban if needed */ vConnections.push_back(std::make_pair(sNewConnectionIP,Timer.elapsed()/1000L)); /* Add connection to list */ iCount = 0; lowest = 30000; fExit = false; for (x=vConnections.size()-1;x>=0;x--) { if ((Timer.elapsed()/1000) - vConnections[x].second >= 30000){ /* Entry is old, remove it */ vConnections.erase(vConnections.begin()+x); continue; } /* Timespan between actual time and connection time of this entry */ actual = (Timer.elapsed()/1000) - vConnections[x].second; if (vConnections[x].first.compare(sNewConnectionIP) == 0) { /* This IP connected more than one time */ iCount++; if (actual < lowest) {lowest = actual;} } /* More than four connections in a timespan of 10 seconds -> ban IP */ if (iCount > 4 && lowest <= 10000) { StrmSock.close(); vBannedIPs.push_back(std::make_pair(sNewConnectionIP,Timer.elapsed()/1000)); /* Set banlenght */ if ((x = search(vBanLenght,sNewConnectionIP)) == -1) { vBanLenght.push_back(std::make_pair(sNewConnectionIP,std::make_pair(10000,Timer.elapsed()/1000 + 5*60*1000))); /*x = vBanLenght.size()-1;*/ }else{ vBanLenght[x].second.first *= 2; vBanLenght[x].second.second = Timer.elapsed()/1000 + (5*60*1000) + vBanLenght[x].second.first; } /*cout<<vBanLenght[x].first<<" banned for:"<< (vBanLenght[x].second.first/1000)<<" seconds\n";*/ fExit = true; break; } } if (fExit) {continue;} #endif if (!_pMinecraftServer->getPlayerPool()->isAnySlotFree()) { //There is no free slot StrmSock.sendBytes(_preparedServerFullMsg.c_str(),_preparedServerFullMsg.length()); StrmSock.close(); continue; } _pMinecraftServer->getPlayerPool()->Assign(StrmSock); }catch(...) { /* Only happen if socket become closed */ _iThreadStatus = FC_THREADSTATUS_DEAD; return; } } }