From 715d0c3952a3a1d59b64074e472d0a9a3b414351 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Thu, 14 Feb 2008 18:04:25 +0000 Subject: dedicated server accepts incoming connections --- src/core/netclient.cc | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/core/netclient.cc (limited to 'src/core/netclient.cc') diff --git a/src/core/netclient.cc b/src/core/netclient.cc new file mode 100644 index 0000000..2df024b --- /dev/null +++ b/src/core/netclient.cc @@ -0,0 +1,90 @@ +/* + net/netclient.h + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#include +#include + +#include "sys/sys.h" +#include "net/net.h" +#include "core/netclient.h" + +namespace core +{ + +NetClient::NetClient(int clientfd, std::string host, int port) : + net::TCPClient(clientfd), + client_host(host) +{ + std::ostringstream osstream; + osstream << host << ":" << port; + client_player.name = osstream.str(); + client_player.id = (unsigned int) clientfd; + + client_host = host; + client_port = port; + //con_debug << "NetClient " << fd() << ": starting." << std::endl; +} + +NetClient::~NetClient() +{ +} + +std::string NetClient::host() const +{ + return client_host; +} + +int NetClient::port() const +{ + return client_port; +} + +Player &NetClient::player() +{ + return client_player; +} + +bool NetClient::has_messages() const { + return (recvq.size() > 0 ); +} + +void NetClient::retreive(std::string & message) { + if (recvq.size() > 0 ) { + message.assign(recvq.front()); + recvq.pop_front(); + } else { + message.clear(); + } +} + +// receive data and decode it into lines +void NetClient::receive() +{ + std::string datablock; + net::TCPClient::receive(datablock); + + while(datablock.size() > 0 ) { + // scan the datablock for enters + if (datablock[0] == '\n' || datablock[0] == '\r') { + // TODO detect "begin binary block" message for zlib compression + if (messageblock.size() > 0 ) { + recvq.push_back(messageblock); + messageblock.clear(); + } + } else { + if (messageblock.size() < net::FRAMESIZE) { + messageblock.append(datablock.substr(0,1)); + } else { + con_warn << "NetClient " << fd() << ": message block overflow" << std::endl; + messageblock.clear(); + } + } + datablock.erase(0,1); + } + datablock.clear(); +} + +} -- cgit v1.2.3