Server.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. #include "../include/Server.h"
  2. #include <iostream>
  3. #include <json/json.h>
  4. using namespace boost::asio;
  5. using ip::tcp;
  6. /***************
  7. * con_handler *
  8. ***************/
  9. con_handler::con_handler(
  10. basic_socket_acceptor<ip::tcp>::executor_type &io_service)
  11. : sock(io_service) {}
  12. con_handler::~con_handler() {}
  13. con_handler::pointer
  14. con_handler::create(basic_socket_acceptor<ip::tcp>::executor_type &io_service) {
  15. return pointer(new con_handler(io_service));
  16. }
  17. tcp::socket &con_handler::socket() { return sock; }
  18. void con_handler::start() {
  19. sock.async_read_some(buffer(data, max_length),
  20. boost::bind(&con_handler::handle_read_version,
  21. shared_from_this(), placeholders::error,
  22. placeholders::bytes_transferred));
  23. }
  24. void con_handler::handle_read(const boost::system::error_code &err,
  25. size_t bytes_transferred) {
  26. if (!err) {
  27. std::cout << this->data << std::endl;
  28. } else {
  29. std::cerr << "error: " << err.message() << std::endl;
  30. sock.close();
  31. }
  32. }
  33. void con_handler::handle_read_version(const boost::system::error_code &err,
  34. size_t bytes_transferred) {
  35. if (!err) {
  36. // set up json stuff
  37. JSONCPP_STRING err;
  38. Json::Value root;
  39. Json::CharReaderBuilder builder;
  40. const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
  41. // parse data
  42. if (!reader->parse(this->data, this->data + bytes_transferred, &root,
  43. &err)) {
  44. std::cerr << "Json error: " << err << std::endl << "data: " << this->data;
  45. sock.close();
  46. }
  47. // create answer
  48. Json::Value answer;
  49. Json::StreamWriterBuilder stringBuilder;
  50. answer["version"] = this->protocolVersion;
  51. // check version string
  52. if (root["version"].compare(this->protocolVersion) == 0) {
  53. answer["accept"] = true;
  54. const std::string answerString = Json::writeString(stringBuilder, answer);
  55. // send answer
  56. sock.async_write_some(buffer(answerString, max_length),
  57. boost::bind(&con_handler::handle_write,
  58. shared_from_this(), placeholders::error,
  59. placeholders::bytes_transferred));
  60. // read next data
  61. sock.async_read_some(buffer(data, max_length),
  62. boost::bind(&con_handler::handle_read_login,
  63. shared_from_this(), placeholders::error,
  64. placeholders::bytes_transferred));
  65. } else {
  66. answer["accept"] = false;
  67. const std::string answerString = Json::writeString(stringBuilder, answer);
  68. // send answer
  69. sock.async_write_some(buffer(answerString, max_length),
  70. boost::bind(&con_handler::handle_write,
  71. shared_from_this(), placeholders::error,
  72. placeholders::bytes_transferred));
  73. // close connection
  74. sock.close();
  75. }
  76. } else {
  77. std::cerr << "error: " << err.message() << std::endl;
  78. sock.close();
  79. }
  80. }
  81. void con_handler::handle_read_login(const boost::system::error_code &err,
  82. size_t bytes_transferred) {
  83. if (!err) {
  84. // set up json stuff
  85. JSONCPP_STRING err;
  86. Json::Value root;
  87. Json::CharReaderBuilder builder;
  88. const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
  89. // parse data
  90. if (!reader->parse(this->data, this->data + bytes_transferred, &root,
  91. &err)) {
  92. std::cerr << "Json error: " << err << std::endl << "data: " << this->data;
  93. sock.close();
  94. }
  95. Json::Value answer;
  96. Json::StreamWriterBuilder stringBuilder;
  97. // user credentials
  98. // TODO check user credentials!!!
  99. if (root["user"].compare("user") == 0 &&
  100. root["pass"].compare("pass") == 0) {
  101. answer["accept"] = true;
  102. const std::string answerString = Json::writeString(stringBuilder, answer);
  103. // send answer
  104. sock.async_write_some(buffer(answerString, max_length),
  105. boost::bind(&con_handler::handle_write,
  106. shared_from_this(), placeholders::error,
  107. placeholders::bytes_transferred));
  108. // read next data
  109. sock.async_read_some(buffer(data, max_length),
  110. boost::bind(&con_handler::handle_read_command,
  111. shared_from_this(), placeholders::error,
  112. placeholders::bytes_transferred));
  113. } else {
  114. answer["accept"] = false;
  115. const std::string answerString = Json::writeString(stringBuilder, answer);
  116. // send answer
  117. sock.async_write_some(buffer(answerString, max_length),
  118. boost::bind(&con_handler::handle_write,
  119. shared_from_this(), placeholders::error,
  120. placeholders::bytes_transferred));
  121. // close connection
  122. sock.close();
  123. }
  124. } else {
  125. std::cerr << "error: " << err.message() << std::endl;
  126. sock.close();
  127. }
  128. }
  129. void con_handler::handle_read_command(const boost::system::error_code &err,
  130. size_t bytes_transferred) {
  131. if (!err) {
  132. // set up json stuff
  133. JSONCPP_STRING err;
  134. Json::Value root;
  135. Json::CharReaderBuilder builder;
  136. const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
  137. // parse data
  138. if (!reader->parse(this->data, this->data + bytes_transferred, &root,
  139. &err)) {
  140. std::cerr << "Json error: " << err << std::endl << "data: " << this->data;
  141. sock.close();
  142. }
  143. Json::Value answer;
  144. Json::StreamWriterBuilder stringBuilder;
  145. // check command
  146. if (root["command"].compare("status") == 0) {
  147. answer["command"] = "status";
  148. // TODO answer a real status message
  149. answer["response"] = "This is a status message :)";
  150. const std::string answerString = Json::writeString(stringBuilder, answer);
  151. // send answer
  152. sock.async_write_some(buffer(answerString, max_length),
  153. boost::bind(&con_handler::handle_write,
  154. shared_from_this(), placeholders::error,
  155. placeholders::bytes_transferred));
  156. // read next data
  157. sock.async_read_some(buffer(data, max_length),
  158. boost::bind(&con_handler::handle_read_command,
  159. shared_from_this(), placeholders::error,
  160. placeholders::bytes_transferred));
  161. } else if (root["command"].compare("list") == 0) {
  162. answer["command"] = "list";
  163. // TODO look for real data
  164. Json::Value array;
  165. array.append("some");
  166. array.append("important");
  167. array.append("data");
  168. answer["names"] = array;
  169. answer["remaining"] = 0;
  170. const std::string answerString = Json::writeString(stringBuilder, answer);
  171. // send answer
  172. sock.async_write_some(buffer(answerString, max_length),
  173. boost::bind(&con_handler::handle_write,
  174. shared_from_this(), placeholders::error,
  175. placeholders::bytes_transferred));
  176. // read next data
  177. sock.async_read_some(buffer(data, max_length),
  178. boost::bind(&con_handler::handle_read_command,
  179. shared_from_this(), placeholders::error,
  180. placeholders::bytes_transferred));
  181. } else if (root["command"].compare("put") == 0) {
  182. answer["command"] = "put";
  183. // TODO establish real connection and receive file
  184. answer["accept"] = false;
  185. const std::string answerString = Json::writeString(stringBuilder, answer);
  186. // send answer
  187. sock.async_write_some(buffer(answerString, max_length),
  188. boost::bind(&con_handler::handle_write,
  189. shared_from_this(), placeholders::error,
  190. placeholders::bytes_transferred));
  191. // read next data
  192. sock.async_read_some(buffer(data, max_length),
  193. boost::bind(&con_handler::handle_read_command,
  194. shared_from_this(), placeholders::error,
  195. placeholders::bytes_transferred));
  196. } else if (root["command"].compare("get") == 0) {
  197. answer["command"] = "get";
  198. // TODO establish real connection and send file
  199. answer["accept"] = false;
  200. const std::string answerString = Json::writeString(stringBuilder, answer);
  201. // send answer
  202. sock.async_write_some(buffer(answerString, max_length),
  203. boost::bind(&con_handler::handle_write,
  204. shared_from_this(), placeholders::error,
  205. placeholders::bytes_transferred));
  206. // read next data
  207. sock.async_read_some(buffer(data, max_length),
  208. boost::bind(&con_handler::handle_read_command,
  209. shared_from_this(), placeholders::error,
  210. placeholders::bytes_transferred));
  211. } else if (root["command"].compare("close") == 0) {
  212. answer["command"] = "close";
  213. answer["response"] = "bye";
  214. const std::string answerString = Json::writeString(stringBuilder, answer);
  215. // send answer
  216. sock.async_write_some(buffer(answerString, max_length),
  217. boost::bind(&con_handler::handle_write,
  218. shared_from_this(), placeholders::error,
  219. placeholders::bytes_transferred));
  220. // close connection
  221. sock.close();
  222. } else {
  223. // TODO handle error
  224. // close connection
  225. sock.close();
  226. }
  227. } else {
  228. std::cerr << "error: " << err.message() << std::endl;
  229. sock.close();
  230. }
  231. }
  232. void con_handler::handle_write(const boost::system::error_code &err,
  233. size_t bytes_transferred) {
  234. if (!err) {
  235. std::cout << "Hello World!" << std::endl;
  236. } else {
  237. std::cerr << "error: " << err.message() << std::endl;
  238. sock.close();
  239. }
  240. }
  241. /**********
  242. * Server *
  243. **********/
  244. void Server::start_accept() {
  245. auto executor = acceptor_.get_executor();
  246. con_handler::pointer connection = con_handler::create(executor);
  247. acceptor_.async_accept(connection->socket(),
  248. boost::bind(&Server::handle_accept, this, connection,
  249. placeholders::error));
  250. }
  251. Server::Server(io_service &io_service)
  252. : acceptor_(io_service, tcp::endpoint(tcp::v4(), 1234)) {
  253. start_accept();
  254. }
  255. Server::~Server() {}
  256. void Server::handle_accept(con_handler::pointer connection,
  257. const boost::system::error_code &err) {
  258. if (!err) {
  259. connection->start();
  260. }
  261. start_accept();
  262. }