123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- #include "../include/Server.h"
- #include <iostream>
- #include <json/json.h>
- using namespace boost::asio;
- using ip::tcp;
- /***************
- * con_handler *
- ***************/
- con_handler::con_handler(
- basic_socket_acceptor<ip::tcp>::executor_type &io_service)
- : sock(io_service) {}
- con_handler::~con_handler() {}
- con_handler::pointer
- con_handler::create(basic_socket_acceptor<ip::tcp>::executor_type &io_service) {
- return pointer(new con_handler(io_service));
- }
- tcp::socket &con_handler::socket() { return sock; }
- void con_handler::start() {
- sock.async_read_some(buffer(data, max_length),
- boost::bind(&con_handler::handle_read_version,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- }
- void con_handler::handle_read(const boost::system::error_code &err,
- size_t bytes_transferred) {
- if (!err) {
- std::cout << this->data << std::endl;
- } else {
- std::cerr << "error: " << err.message() << std::endl;
- sock.close();
- }
- }
- void con_handler::handle_read_version(const boost::system::error_code &err,
- size_t bytes_transferred) {
- if (!err) {
- // set up json stuff
- JSONCPP_STRING err;
- Json::Value root;
- Json::CharReaderBuilder builder;
- const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
- // parse data
- if (!reader->parse(this->data, this->data + bytes_transferred, &root,
- &err)) {
- std::cerr << "Json error: " << err << std::endl << "data: " << this->data;
- sock.close();
- }
- // create answer
- Json::Value answer;
- Json::StreamWriterBuilder stringBuilder;
- answer["version"] = this->protocolVersion;
- // check version string
- if (root["version"].compare(this->protocolVersion) == 0) {
- answer["accept"] = true;
- const std::string answerString = Json::writeString(stringBuilder, answer);
- // send answer
- sock.async_write_some(buffer(answerString, max_length),
- boost::bind(&con_handler::handle_write,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- // read next data
- sock.async_read_some(buffer(data, max_length),
- boost::bind(&con_handler::handle_read_login,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- } else {
- answer["accept"] = false;
- const std::string answerString = Json::writeString(stringBuilder, answer);
- // send answer
- sock.async_write_some(buffer(answerString, max_length),
- boost::bind(&con_handler::handle_write,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- // close connection
- sock.close();
- }
- } else {
- std::cerr << "error: " << err.message() << std::endl;
- sock.close();
- }
- }
- void con_handler::handle_read_login(const boost::system::error_code &err,
- size_t bytes_transferred) {
- if (!err) {
- // set up json stuff
- JSONCPP_STRING err;
- Json::Value root;
- Json::CharReaderBuilder builder;
- const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
- // parse data
- if (!reader->parse(this->data, this->data + bytes_transferred, &root,
- &err)) {
- std::cerr << "Json error: " << err << std::endl << "data: " << this->data;
- sock.close();
- }
- Json::Value answer;
- Json::StreamWriterBuilder stringBuilder;
- // user credentials
- // TODO check user credentials!!!
- if (root["user"].compare("user") == 0 &&
- root["pass"].compare("pass") == 0) {
- answer["accept"] = true;
- const std::string answerString = Json::writeString(stringBuilder, answer);
- // send answer
- sock.async_write_some(buffer(answerString, max_length),
- boost::bind(&con_handler::handle_write,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- // read next data
- sock.async_read_some(buffer(data, max_length),
- boost::bind(&con_handler::handle_read_command,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- } else {
- answer["accept"] = false;
- const std::string answerString = Json::writeString(stringBuilder, answer);
- // send answer
- sock.async_write_some(buffer(answerString, max_length),
- boost::bind(&con_handler::handle_write,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- // close connection
- sock.close();
- }
- } else {
- std::cerr << "error: " << err.message() << std::endl;
- sock.close();
- }
- }
- void con_handler::handle_read_command(const boost::system::error_code &err,
- size_t bytes_transferred) {
- if (!err) {
- // set up json stuff
- JSONCPP_STRING err;
- Json::Value root;
- Json::CharReaderBuilder builder;
- const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
- // parse data
- if (!reader->parse(this->data, this->data + bytes_transferred, &root,
- &err)) {
- std::cerr << "Json error: " << err << std::endl << "data: " << this->data;
- sock.close();
- }
- Json::Value answer;
- Json::StreamWriterBuilder stringBuilder;
- // check command
- if (root["command"].compare("status") == 0) {
- answer["command"] = "status";
- // TODO answer a real status message
- answer["response"] = "This is a status message :)";
- const std::string answerString = Json::writeString(stringBuilder, answer);
- // send answer
- sock.async_write_some(buffer(answerString, max_length),
- boost::bind(&con_handler::handle_write,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- // read next data
- sock.async_read_some(buffer(data, max_length),
- boost::bind(&con_handler::handle_read_command,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- } else if (root["command"].compare("list") == 0) {
- answer["command"] = "list";
- // TODO look for real data
- Json::Value array;
- array.append("some");
- array.append("important");
- array.append("data");
- answer["names"] = array;
- answer["remaining"] = 0;
- const std::string answerString = Json::writeString(stringBuilder, answer);
- // send answer
- sock.async_write_some(buffer(answerString, max_length),
- boost::bind(&con_handler::handle_write,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- // read next data
- sock.async_read_some(buffer(data, max_length),
- boost::bind(&con_handler::handle_read_command,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- } else if (root["command"].compare("put") == 0) {
- answer["command"] = "put";
- // TODO establish real connection and receive file
- answer["accept"] = false;
- const std::string answerString = Json::writeString(stringBuilder, answer);
- // send answer
- sock.async_write_some(buffer(answerString, max_length),
- boost::bind(&con_handler::handle_write,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- // read next data
- sock.async_read_some(buffer(data, max_length),
- boost::bind(&con_handler::handle_read_command,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- } else if (root["command"].compare("get") == 0) {
- answer["command"] = "get";
- // TODO establish real connection and send file
- answer["accept"] = false;
- const std::string answerString = Json::writeString(stringBuilder, answer);
- // send answer
- sock.async_write_some(buffer(answerString, max_length),
- boost::bind(&con_handler::handle_write,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- // read next data
- sock.async_read_some(buffer(data, max_length),
- boost::bind(&con_handler::handle_read_command,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- } else if (root["command"].compare("close") == 0) {
- answer["command"] = "close";
- answer["response"] = "bye";
- const std::string answerString = Json::writeString(stringBuilder, answer);
- // send answer
- sock.async_write_some(buffer(answerString, max_length),
- boost::bind(&con_handler::handle_write,
- shared_from_this(), placeholders::error,
- placeholders::bytes_transferred));
- // close connection
- sock.close();
- } else {
- // TODO handle error
- // close connection
- sock.close();
- }
- } else {
- std::cerr << "error: " << err.message() << std::endl;
- sock.close();
- }
- }
- void con_handler::handle_write(const boost::system::error_code &err,
- size_t bytes_transferred) {
- if (!err) {
- std::cout << "Hello World!" << std::endl;
- } else {
- std::cerr << "error: " << err.message() << std::endl;
- sock.close();
- }
- }
- /**********
- * Server *
- **********/
- void Server::start_accept() {
- auto executor = acceptor_.get_executor();
- con_handler::pointer connection = con_handler::create(executor);
- acceptor_.async_accept(connection->socket(),
- boost::bind(&Server::handle_accept, this, connection,
- placeholders::error));
- }
- Server::Server(io_service &io_service)
- : acceptor_(io_service, tcp::endpoint(tcp::v4(), 1234)) {
- start_accept();
- }
- Server::~Server() {}
- void Server::handle_accept(con_handler::pointer connection,
- const boost::system::error_code &err) {
- if (!err) {
- connection->start();
- }
- start_accept();
- }
|