Advertisement
Guest User

Untitled

a guest
Aug 16th, 2014
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.47 KB | None | 0 0
  1. + ls
  2. echo_server.cpp
  3. run.sh
  4. + rm -f echo_server
  5. + ./echo_server
  6. ./run.sh: строка 5: ./echo_server: Нет такого файла или каталога
  7. + cat ./run.sh
  8. #!/bin/bash -x
  9.  
  10. ls
  11. rm -f echo_server
  12. ./echo_server
  13. cat $0
  14. cat echo_server.cpp
  15.  
  16. uname -srm
  17. g++ --version
  18. dpkg -l *boost* | grep ^ii
  19.  
  20. g++ \
  21. -std=c++11 \
  22. echo_server.cpp \
  23. -oecho_server \
  24. -lboost_coroutine \
  25. -lboost_context \
  26. -lboost_system \
  27. -pthread
  28.  
  29. ./echo_server
  30. + cat echo_server.cpp
  31. //
  32. // echo_server.cpp
  33. // ~~~~~~~~~~~~~~~
  34. //
  35. // Copyright (c) 2003-2014 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  36. //
  37. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  38. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  39. //
  40.  
  41. #include <boost/asio/io_service.hpp>
  42. #include <boost/asio/ip/tcp.hpp>
  43. #include <boost/asio/spawn.hpp>
  44. #include <boost/asio/steady_timer.hpp>
  45. #include <boost/asio/write.hpp>
  46. #include <iostream>
  47. #include <memory>
  48.  
  49. using boost::asio::ip::tcp;
  50.  
  51. class session : public std::enable_shared_from_this<session>
  52. {
  53. public:
  54. explicit session(tcp::socket socket)
  55. : socket_(std::move(socket)),
  56. timer_(socket_.get_io_service()),
  57. strand_(socket_.get_io_service())
  58. {
  59. }
  60.  
  61. void go()
  62. {
  63. auto self(shared_from_this());
  64. boost::asio::spawn(strand_,
  65. [this, self](boost::asio::yield_context yield)
  66. {
  67. try
  68. {
  69. char data[128];
  70. for (;;)
  71. {
  72. timer_.expires_from_now(std::chrono::seconds(10));
  73. std::size_t n = socket_.async_read_some(boost::asio::buffer(data), yield);
  74. boost::asio::async_write(socket_, boost::asio::buffer(data, n), yield);
  75. }
  76. }
  77. catch (std::exception& e)
  78. {
  79. socket_.close();
  80. timer_.cancel();
  81. }
  82. });
  83.  
  84. boost::asio::spawn(strand_,
  85. [this, self](boost::asio::yield_context yield)
  86. {
  87. while (socket_.is_open())
  88. {
  89. boost::system::error_code ignored_ec;
  90. timer_.async_wait(yield[ignored_ec]);
  91. if (timer_.expires_from_now() <= std::chrono::seconds(0))
  92. socket_.close();
  93. }
  94. });
  95. }
  96.  
  97. private:
  98. tcp::socket socket_;
  99. boost::asio::steady_timer timer_;
  100. boost::asio::io_service::strand strand_;
  101. };
  102.  
  103. int main(int argc, char* argv[])
  104. {
  105. try
  106. {
  107. if (argc != 2)
  108. {
  109. std::cerr << "Usage: echo_server <port>\n";
  110. return 1;
  111. }
  112.  
  113. boost::asio::io_service io_service;
  114.  
  115. boost::asio::spawn(io_service,
  116. [&](boost::asio::yield_context yield)
  117. {
  118. tcp::acceptor acceptor(io_service,
  119. tcp::endpoint(tcp::v4(), std::atoi(argv[1])));
  120.  
  121. for (;;)
  122. {
  123. boost::system::error_code ec;
  124. tcp::socket socket(io_service);
  125. acceptor.async_accept(socket, yield[ec]);
  126. if (!ec) std::make_shared<session>(std::move(socket))->go();
  127. }
  128. });
  129.  
  130. io_service.run();
  131. }
  132. catch (std::exception& e)
  133. {
  134. std::cerr << "Exception: " << e.what() << "\n";
  135. }
  136.  
  137. return 0;
  138. }
  139. + uname -srm
  140. Linux 3.16.0-7-generic x86_64
  141. + g++ --version
  142. g++ (Ubuntu 4.9.1-4ubuntu3) 4.9.1
  143. Copyright (C) 2014 Free Software Foundation, Inc.
  144. This is free software; see the source for copying conditions. There is NO
  145. warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  146.  
  147. + grep '^ii'
  148. + dpkg -l '*boost*'
  149. ii libboost-context-dev:amd64 1.55.0.1~ubuntu1 amd64 provides a sort of cooperative multitasking on a single thread (default version)
  150. ii libboost-context1.55-dev:amd64 1.55.0+dfsg-1ubuntu3 amd64 provides a sort of cooperative multitasking on a single thread
  151. ii libboost-context1.55.0:amd64 1.55.0+dfsg-1ubuntu3 amd64 provides a sort of cooperative multitasking on a single thread
  152. ii libboost-coroutine-dev 1.55.0.1~ubuntu1 amd64 provides a sort of cooperative multitasking on a single thread (default version)
  153. ii libboost-coroutine1.55-dev:amd64 1.55.0+dfsg-1ubuntu3 amd64 provides a sort of cooperative multitasking on a single thread
  154. ii libboost-date-time1.49.0 1.49.0-4 amd64 set of date-time libraries based on generic programming concepts
  155. ii libboost-date-time1.55.0:amd64 1.55.0+dfsg-1ubuntu3 amd64 set of date-time libraries based on generic programming concepts
  156. ii libboost-program-options1.55.0:amd64 1.55.0+dfsg-1ubuntu3 amd64 program options library for C++
  157. ii libboost-system-dev:amd64 1.55.0.1~ubuntu1 amd64 Operating system (e.g. diagnostics support) library (default version)
  158. ii libboost-system1.55-dev:amd64 1.55.0+dfsg-1ubuntu3 amd64 Operating system (e.g. diagnostics support) library
  159. ii libboost-system1.55.0:amd64 1.55.0+dfsg-1ubuntu3 amd64 Operating system (e.g. diagnostics support) library
  160. ii libboost-thread1.55.0:amd64 1.55.0+dfsg-1ubuntu3 amd64 portable C++ multi-threading
  161. ii libboost-wave1.55.0:amd64 1.55.0+dfsg-1ubuntu3 amd64 C99/C++ preprocessor library
  162. ii libboost1.55-dev:amd64 1.55.0+dfsg-1ubuntu3 amd64 Boost C++ Libraries development files
  163. + g++ -std=c++11 echo_server.cpp -oecho_server -lboost_coroutine -lboost_context -lboost_system -pthread
  164. + ./echo_server
  165. Usage: echo_server <port>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement