From 9fa6460f22be5482239d0b903af985a519f77166 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 1 Jun 2011 19:28:24 +0200 Subject: Initial commit. --- server.cpp | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 server.cpp (limited to 'server.cpp') diff --git a/server.cpp b/server.cpp new file mode 100644 index 0000000..18e099c --- /dev/null +++ b/server.cpp @@ -0,0 +1,105 @@ +#include "server.h" +#include "messages.h" +#include "terrain_generator.h" + +#include + +Server::Server(boost::asio::io_service& io_service) + : acceptor(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), 54321)) { + TerrainGenerator::p gen(new TerrainGenerator(0, "map")); + cache = TerrainCache::p(new TerrainCache(gen, 500)); + start_accept(); +} + +void Server::start_accept() { + Connection::p c(new Connection(acceptor.io_service())); + acceptor.async_accept(c->socket, boost::bind(&Server::handle_connect, this, c)); +} + +void Server::handle_connect(Connection::p connection) { + start_accept(); + + uint8_t type = message::MessageBase::read_type(connection->socket); + std::cout << "type: " << (int)type << std::endl; + + message::Hello h; + //h.b = boost::asio::buffer(&version, sizeof(version)); + std::cout << "reading payload" << std::endl; + h.read(connection->socket); + std::cout << "fetching version" << std::endl; + uint8_t version = h.read_version(); + std::cout << "version: " << (int)version << std::endl; + + async_read(connection); + + /*boost::asio::streambuf b; + boost::asio::read_until(connection->get_socket(), b, '\n'); + + std::istream is(&b); + std::string s; + is >> s; + std::cout << s << std::endl; + for(std::list::iterator it = clients.begin(); it != clients.end(); it++) { + boost::asio::write((*it)->get_socket(), boost::asio::buffer(s + "\n")); + }*/ +} + +void Server::async_read(Connection::p connection) { + uint8_t *t = new uint8_t; + boost::asio::async_read(connection->socket, boost::asio::buffer(t, sizeof(uint8_t)), + boost::asio::transfer_all(), + boost::bind(&Server::handle_message, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, connection, t)); +} + +void Server::handle_message(const boost::system::error_code& error, size_t bytes_transferred, Connection::p connection, uint8_t *_type) { + uint8_t type = *_type; + delete _type; + + if(error) { + std::cerr << "error: " << error.message() << std::endl; + for(std::list::iterator it = clients.begin(); it != clients.end(); it++) { + if(*it == connection) { + clients.erase(it); + break; + } + } + return; + } + + switch(type) { + case message::MSG_TYPE_POS: + handle_pos(connection); + break; + case message::MSG_TYPE_CHUNK: + handle_chunk(connection); + break; + default: + std::cout << "unknown type: " << (int)type << std::endl; + } + + async_read(connection); +} + +void Server::handle_pos(Connection::p c) { + message::Pos m; + + m.read(c->socket); + m.get_pos(c->pos.x, c->pos.y, c->pos.z); + + std::set > chunks = c->check_chunks(); + for(std::set >::iterator it = chunks.begin(); it != chunks.end(); it++) { + // TODO: fix sizes + TerrainCacheObject::p obj = cache->get_chunk(it->first, it->second, 35, 35); + message::Chunk chunk(it->first, it->second); + chunk.set_data(obj->heights); + chunk.send(c->socket); + } +} + +void Server::handle_chunk(Connection::p c) { + message::Chunk m; + + m.read(c->socket); + int64_t x, y; + m.get_coords(x, y); +} -- cgit v1.2.3