Advertisement
Guest User

Code

a guest
Jul 28th, 2015
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.32 KB | None | 0 0
  1. #include <ctime>
  2. #include <iostream>
  3. #include <string>
  4.  
  5. #include <boost/bind.hpp>
  6. #include <boost/shared_ptr.hpp>
  7. #include <boost/enable_shared_from_this.hpp>
  8. #include <boost/asio.hpp>
  9. #include <boost/algorithm/string.hpp>
  10.  
  11. #include <json/reader.h>
  12. #include <json/writer.h>
  13.  
  14. namespace {
  15.     Json::Value to_json(std::string json)
  16.     {
  17.         Json::Value root;
  18.         Json::Reader reader;
  19.         /*bool success =*/ reader.parse(json, root);
  20.         return root;
  21.     }
  22.  
  23.     std::string to_string(Json::Value root) // unused TODO FIXME
  24.     {
  25.         Json::FastWriter writer;
  26.         std::string json = writer.write(root);
  27.         return json;
  28.     }
  29. }
  30.  
  31. using boost::asio::ip::tcp;
  32.  
  33. class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
  34. {
  35.   public:
  36.     typedef boost::shared_ptr<tcp_connection> pointer;
  37.  
  38.     static pointer create(boost::asio::io_service& io_service)
  39.     {
  40.         return pointer(new tcp_connection(io_service));
  41.     }
  42.  
  43.     tcp::socket& socket()
  44.     {
  45.         return socket_;
  46.     }
  47.  
  48.     void start()
  49.     {
  50.         //Read from client, make json and send appropriate response
  51.         boost::asio::async_read(socket_, message_,boost::asio::transfer_at_least(10),
  52.                 boost::bind(&tcp_connection::handle_read, shared_from_this(),
  53.                     boost::asio::placeholders::error,
  54.                     boost::asio::placeholders::bytes_transferred));
  55.     }
  56.  
  57.   private:
  58.     tcp_connection(boost::asio::io_service& io_service)
  59.         : socket_(io_service)
  60.     {
  61.     }
  62.  
  63.     void handle_write(const boost::system::error_code& /*error*/,
  64.             size_t /*bytes_transferred*/)
  65.     {
  66.     }
  67.  
  68.     void handle_read(const boost::system::error_code& error, size_t bytes_transferred)
  69.     {
  70.         std::cout << "Handle Read of connection\n";
  71.  
  72.         if (error && error != boost::asio::error::eof) {
  73.             std::cout << "Error: " << error.message() << "\n";
  74.             return;
  75.         }
  76.  
  77.  
  78.         std::string messageP;
  79.         {
  80.             std::stringstream ss;
  81.             ss << &message_;
  82.             ss.flush();
  83.             messageP = ss.str();
  84.         }
  85.  
  86.         std::cout << messageP << std::endl;
  87.  
  88.  
  89.         Json::Value root      = to_json(messageP);
  90.         std::string isHello   = root["hello"].asString();
  91.         std::string isMessage = root["message"].asString();
  92.         if(!isHello.empty())
  93.         {
  94.             std::string messageTemp = "{\"hello\":\"Server\"}";
  95.             boost::asio::async_write(socket_, boost::asio::buffer(messageTemp),
  96.                     boost::bind(&tcp_connection::handle_write, shared_from_this(),
  97.                         boost::asio::placeholders::error,
  98.                         boost::asio::placeholders::bytes_transferred));
  99.         }
  100.  
  101.         if(!isMessage.empty())
  102.         {
  103.             std::string messageTemp = "{\"response\":\"Fine\"}";
  104.             boost::asio::async_write(socket_, boost::asio::buffer(messageTemp),
  105.                     boost::bind(&tcp_connection::handle_write, shared_from_this(),
  106.                         boost::asio::placeholders::error,
  107.                         boost::asio::placeholders::bytes_transferred));
  108.         }
  109.     }
  110.  
  111.     tcp::socket socket_;
  112.     boost::asio::streambuf message_;
  113. };
  114.  
  115. class tcp_server
  116. {
  117.   public:
  118.     tcp_server(boost::asio::io_service& io_service)
  119.         : acceptor_(io_service, tcp::endpoint(tcp::v4(), 1936))
  120.     {
  121.         start_accept();
  122.     }
  123.  
  124.   private:
  125.     void start_accept()
  126.     {
  127.         tcp_connection::pointer new_connection =
  128.             tcp_connection::create(acceptor_.get_io_service());
  129.  
  130.       acceptor_.async_accept(new_connection->socket(),
  131.           boost::bind(&tcp_server::handle_accept, this, new_connection,
  132.             boost::asio::placeholders::error));
  133.     }
  134.  
  135.     void handle_accept(tcp_connection::pointer new_connection, const boost::system::error_code& error)
  136.     {
  137.         if (!error)
  138.         {
  139.             std::cout << "A client connected" << std::endl;
  140.             new_connection->start();
  141.         }
  142.  
  143.         start_accept();
  144.     }
  145.  
  146.     tcp::acceptor acceptor_;
  147. };
  148.  
  149. int main()
  150. {
  151.     try
  152.     {
  153.         boost::asio::io_service io_service;
  154.         tcp_server server(io_service);
  155.         io_service.run();
  156.     }
  157.     catch (std::exception& e)
  158.     {
  159.         std::cerr << e.what() << std::endl;
  160.     }
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement