daytime_client.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //
  2. // daytime_client.cpp
  3. // ~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. #include <boost/asio.hpp>
  11. #include <boost/bind.hpp>
  12. #include <iostream>
  13. #include "logger.hpp"
  14. using boost::asio::ip::tcp;
  15. char read_buffer[1024];
  16. void read_handler(const boost::system::error_code& e,
  17. std::size_t bytes_transferred, tcp::socket* s)
  18. {
  19. if (!e)
  20. {
  21. std::cout.write(read_buffer, bytes_transferred);
  22. s->async_read_some(boost::asio::buffer(read_buffer),
  23. boost::bind(read_handler, boost::asio::placeholders::error,
  24. boost::asio::placeholders::bytes_transferred, s));
  25. }
  26. else
  27. {
  28. services::logger logger(s->get_executor().context(), "read_handler");
  29. std::string msg = "Read error: ";
  30. msg += e.message();
  31. logger.log(msg);
  32. }
  33. }
  34. void connect_handler(const boost::system::error_code& e, tcp::socket* s)
  35. {
  36. services::logger logger(s->get_executor().context(), "connect_handler");
  37. if (!e)
  38. {
  39. logger.log("Connection established");
  40. s->async_read_some(boost::asio::buffer(read_buffer),
  41. boost::bind(read_handler, boost::asio::placeholders::error,
  42. boost::asio::placeholders::bytes_transferred, s));
  43. }
  44. else
  45. {
  46. std::string msg = "Unable to establish connection: ";
  47. msg += e.message();
  48. logger.log(msg);
  49. }
  50. }
  51. int main(int argc, char* argv[])
  52. {
  53. try
  54. {
  55. if (argc != 2)
  56. {
  57. std::cerr << "Usage: daytime_client <host>" << std::endl;
  58. return 1;
  59. }
  60. boost::asio::io_context io_context;
  61. // Set the name of the file that all logger instances will use.
  62. services::logger logger(io_context, "");
  63. logger.use_file("log.txt");
  64. // Resolve the address corresponding to the given host.
  65. tcp::resolver resolver(io_context);
  66. tcp::resolver::results_type endpoints =
  67. resolver.resolve(argv[1], "daytime");
  68. // Start an asynchronous connect.
  69. tcp::socket socket(io_context);
  70. boost::asio::async_connect(socket, endpoints,
  71. boost::bind(connect_handler,
  72. boost::asio::placeholders::error, &socket));
  73. // Run the io_context until all operations have finished.
  74. io_context.run();
  75. }
  76. catch (std::exception& e)
  77. {
  78. std::cerr << e.what() << std::endl;
  79. }
  80. return 0;
  81. }