#include #include #include #include "server.hpp" using asio::ip::tcp; void Server::start(void) { boost::shared_ptr new_client(new ClientSocket(io_service)); acceptor_.async_accept(new_client->socket(), boost::bind(&Server::handle_accept, this, new_client, asio::placeholders::error)); io_service.run(); } void Server::stop(void) { acceptor_.close(); std::vector >::iterator i; for (i=clients.begin(); i != clients.end(); ++i) { (*i)->close(); } } void Server::handle_accept(boost::shared_ptr new_client, const asio::error& error) { if (!error) { clients.push_back(new_client); asio::async_read_until(new_client->socket(), buffer, '\n', boost::bind(&Server::handle_read, this, new_client, asio::placeholders::error, asio::placeholders::bytes_transferred)); boost::shared_ptr new_client(new ClientSocket(io_service)); acceptor_.async_accept(new_client->socket(), boost::bind(&Server::handle_accept, this, new_client, asio::placeholders::error)); } else { new_client.reset(); } } void Server::handle_read(boost::shared_ptr c, const asio::error& error, std::size_t size) { if (!error) { std::istream is(&buffer); std::string line; std::getline(is, line); std::vector splitVec; boost::split(splitVec, line, boost::is_any_of(";")); if (splitVec.at(0).compare("turn") == 0) { // check if turn is valid and promote it std::cout << "turn received " << std::endl; } else if (splitVec.at(0).compare("chat") == 0) { } this->promoteStringToClients(line); } else { if (error.code() == asio::error::connection_aborted || error.code() == asio::error::network_down || error.code() == asio::error::network_reset || error.code() == asio::error::network_unreachable || error.code() == asio::error::not_connected ) { c.reset(); } } } void Server::handle_write(boost::shared_ptr c, const asio::error& error, std::size_t bytes_transferred) { if (!error) { std::vector >::iterator i; for (i=clients.begin(); i != clients.end(); ++i) { asio::async_read_until((*i)->socket(), buffer, '\n', boost::bind(&Server::handle_read, this, *i, asio::placeholders::error, asio::placeholders::bytes_transferred)); } } else { if (error.code() == asio::error::connection_aborted || error.code() == asio::error::network_down || error.code() == asio::error::network_reset || error.code() == asio::error::network_unreachable || error.code() == asio::error::not_connected ) { c.reset(); } } } void Server::promoteStringToClients(std::string str) { std::vector >::iterator i; for (i=clients.begin(); i != clients.end(); ++i) { this->writeStringToSocket(*i, str); /* if (c != *i) { this.writeStringToSocket((*i)->socket(), str); } */ } } void Server::writeStringToSocket(boost::shared_ptr c, std::string str) { asio::async_write(c->socket(), asio::buffer(str.c_str(), str.size()), boost::bind(&Server::handle_write, this, c, asio::placeholders::error, asio::placeholders::bytes_transferred)); } int main(int argc, char* argv[]) { try { Server s(1337); s.start(); } catch (asio::error& e) { std::cerr << "Error: " << e << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; }