/* * NetworkServer.cpp, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #include "StdInc.h" #include "NetworkServer.h" #include "NetworkConnection.h" VCMI_LIB_NAMESPACE_BEGIN NetworkServer::NetworkServer(INetworkServerListener & listener) :listener(listener) { } void NetworkServer::start(uint16_t port) { io = std::make_shared(); acceptor = std::make_shared(*io, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)); startAsyncAccept(); } void NetworkServer::startAsyncAccept() { std::shared_ptr upcomingConnection = std::make_shared(*io); acceptor->async_accept(*upcomingConnection, std::bind(&NetworkServer::connectionAccepted, this, upcomingConnection, _1)); } void NetworkServer::run() { io->run(); } void NetworkServer::run(std::chrono::milliseconds duration) { io->run_for(duration); } void NetworkServer::connectionAccepted(std::shared_ptr upcomingConnection, const boost::system::error_code & ec) { if(ec) { throw std::runtime_error("Something wrong during accepting: " + ec.message()); } logNetwork->info("We got a new connection! :)"); auto connection = std::make_shared(upcomingConnection, *this); connections.insert(connection); connection->start(); listener.onNewConnection(connection); startAsyncAccept(); } void NetworkServer::sendPacket(const std::shared_ptr & connection, const std::vector & message) { connection->sendPacket(message); } void NetworkServer::onDisconnected(const std::shared_ptr & connection) { assert(connections.count(connection)); connections.erase(connection); listener.onDisconnected(connection); } void NetworkServer::onPacketReceived(const std::shared_ptr & connection, const std::vector & message) { listener.onPacketReceived(connection, message); } VCMI_LIB_NAMESPACE_END