Add C++11 versions of the echo examples.
diff --git a/asio/boostify.pl b/asio/boostify.pl index 0f8a22c..74c5f9d 100755 --- a/asio/boostify.pl +++ b/asio/boostify.pl
@@ -470,6 +470,9 @@ "src/examples/cpp03/tutorial/timer5", "src/examples/cpp03/windows", "src/examples/cpp11/allocation", + "src/examples/cpp11/buffers", + "src/examples/cpp11/chat", + "src/examples/cpp11/echo", "src/examples/cpp11/spawn"); our $boost_dir;
diff --git a/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp b/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp index 6d9e60a..e93cce9 100644 --- a/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp +++ b/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp
@@ -44,7 +44,7 @@ } } -void server(asio::io_service& io_service, short port) +void server(asio::io_service& io_service, unsigned short port) { tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port)); for (;;)
diff --git a/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp b/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp index a4a49ea..46f9870 100644 --- a/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp +++ b/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp
@@ -16,7 +16,7 @@ enum { max_length = 1024 }; -void server(asio::io_service& io_service, short port) +void server(asio::io_service& io_service, unsigned short port) { udp::socket sock(io_service, udp::endpoint(udp::v4(), port)); for (;;)
diff --git a/asio/src/examples/cpp11/Makefile.am b/asio/src/examples/cpp11/Makefile.am index 04caa6d..d62a797 100644 --- a/asio/src/examples/cpp11/Makefile.am +++ b/asio/src/examples/cpp11/Makefile.am
@@ -13,7 +13,13 @@ allocation/server \ buffers/reference_counted \ chat/chat_client \ - chat/chat_server + chat/chat_server \ + echo/async_tcp_echo_server \ + echo/async_udp_echo_server \ + echo/blocking_tcp_echo_client \ + echo/blocking_tcp_echo_server \ + echo/blocking_udp_echo_client \ + echo/blocking_udp_echo_server noinst_HEADERS = \ chat/chat_message.hpp @@ -24,6 +30,12 @@ buffers_reference_counted_SOURCES = buffers/reference_counted.cpp chat_chat_client_SOURCES = chat/chat_client.cpp chat_chat_server_SOURCES = chat/chat_server.cpp +echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp +echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp +echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp +echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp +echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp +echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp MAINTAINERCLEANFILES = \ $(srcdir)/Makefile.in
diff --git a/asio/src/examples/cpp11/echo/.gitignore b/asio/src/examples/cpp11/echo/.gitignore new file mode 100644 index 0000000..0882fa6 --- /dev/null +++ b/asio/src/examples/cpp11/echo/.gitignore
@@ -0,0 +1,11 @@ +.deps +.dirstamp +*.o +*.obj +*.exe +*_server +*_client +*.ilk +*.manifest +*.pdb +*.tds
diff --git a/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp b/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp new file mode 100644 index 0000000..d3a6e9e --- /dev/null +++ b/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp
@@ -0,0 +1,116 @@ +// +// async_tcp_echo_server.cpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include <cstdlib> +#include <iostream> +#include <memory> +#include <utility> +#include "asio.hpp" + +using asio::ip::tcp; + +class session + : public std::enable_shared_from_this<session> +{ +public: + session(tcp::socket socket) + : socket_(std::move(socket)) + { + } + + void start() + { + do_read(); + } + +private: + void do_read() + { + auto self(shared_from_this()); + socket_.async_read_some(asio::buffer(data_, max_length), + [this, self](std::error_code ec, std::size_t length) + { + if (!ec) + { + do_write(length); + } + }); + } + + void do_write(std::size_t length) + { + auto self(shared_from_this()); + asio::async_write(socket_, asio::buffer(data_, length), + [this, self](std::error_code ec, std::size_t /*length*/) + { + if (!ec) + { + do_read(); + } + }); + } + + tcp::socket socket_; + enum { max_length = 1024 }; + char data_[max_length]; +}; + +class server +{ +public: + server(asio::io_service& io_service, short port) + : acceptor_(io_service, tcp::endpoint(tcp::v4(), port)), + socket_(io_service) + { + do_accept(); + } + +private: + void do_accept() + { + acceptor_.async_accept(socket_, + [this](std::error_code ec) + { + if (!ec) + { + std::make_shared<session>(std::move(socket_))->start(); + } + + do_accept(); + }); + } + + tcp::acceptor acceptor_; + tcp::socket socket_; +}; + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 2) + { + std::cerr << "Usage: async_tcp_echo_server <port>\n"; + return 1; + } + + asio::io_service io_service; + + server s(io_service, std::atoi(argv[1])); + + io_service.run(); + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << "\n"; + } + + return 0; +}
diff --git a/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp b/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp new file mode 100644 index 0000000..a5a448b --- /dev/null +++ b/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp
@@ -0,0 +1,82 @@ +// +// async_udp_echo_server.cpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include <cstdlib> +#include <iostream> +#include "asio.hpp" + +using asio::ip::udp; + +class server +{ +public: + server(asio::io_service& io_service, short port) + : socket_(io_service, udp::endpoint(udp::v4(), port)) + { + do_receive(); + } + + void do_receive() + { + socket_.async_receive_from( + asio::buffer(data_, max_length), sender_endpoint_, + [this](std::error_code ec, std::size_t bytes_recvd) + { + if (!ec && bytes_recvd > 0) + { + do_send(bytes_recvd); + } + else + { + do_receive(); + } + }); + } + + void do_send(std::size_t length) + { + socket_.async_send_to( + asio::buffer(data_, length), sender_endpoint_, + [this](std::error_code /*ec*/, std::size_t /*bytes_sent*/) + { + do_receive(); + }); + } + +private: + udp::socket socket_; + udp::endpoint sender_endpoint_; + enum { max_length = 1024 }; + char data_[max_length]; +}; + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 2) + { + std::cerr << "Usage: async_udp_echo_server <port>\n"; + return 1; + } + + asio::io_service io_service; + + server s(io_service, std::atoi(argv[1])); + + io_service.run(); + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << "\n"; + } + + return 0; +}
diff --git a/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp b/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp new file mode 100644 index 0000000..fc5b69f --- /dev/null +++ b/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp
@@ -0,0 +1,55 @@ +// +// blocking_tcp_echo_client.cpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include <cstdlib> +#include <cstring> +#include <iostream> +#include "asio.hpp" + +using asio::ip::tcp; + +enum { max_length = 1024 }; + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 3) + { + std::cerr << "Usage: blocking_tcp_echo_client <host> <port>\n"; + return 1; + } + + asio::io_service io_service; + + tcp::socket s(io_service); + tcp::resolver resolver(io_service); + asio::connect(s, resolver.resolve({argv[1], argv[2]})); + + std::cout << "Enter message: "; + char request[max_length]; + std::cin.getline(request, max_length); + size_t request_length = std::strlen(request); + asio::write(s, asio::buffer(request, request_length)); + + char reply[max_length]; + size_t reply_length = asio::read(s, + asio::buffer(reply, request_length)); + std::cout << "Reply is: "; + std::cout.write(reply, reply_length); + std::cout << "\n"; + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << "\n"; + } + + return 0; +}
diff --git a/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp b/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp new file mode 100644 index 0000000..807d04c --- /dev/null +++ b/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp
@@ -0,0 +1,76 @@ +// +// blocking_tcp_echo_server.cpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include <cstdlib> +#include <iostream> +#include <thread> +#include <utility> +#include "asio.hpp" + +using asio::ip::tcp; + +const int max_length = 1024; + +void session(tcp::socket sock) +{ + try + { + for (;;) + { + char data[max_length]; + + asio::error_code error; + size_t length = sock.read_some(asio::buffer(data), error); + if (error == asio::error::eof) + break; // Connection closed cleanly by peer. + else if (error) + throw asio::system_error(error); // Some other error. + + asio::write(sock, asio::buffer(data, length)); + } + } + catch (std::exception& e) + { + std::cerr << "Exception in thread: " << e.what() << "\n"; + } +} + +void server(asio::io_service& io_service, unsigned short port) +{ + tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port)); + for (;;) + { + tcp::socket sock(io_service); + a.accept(sock); + std::thread(session, std::move(sock)).detach(); + } +} + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 2) + { + std::cerr << "Usage: blocking_tcp_echo_server <port>\n"; + return 1; + } + + asio::io_service io_service; + + server(io_service, std::atoi(argv[1])); + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << "\n"; + } + + return 0; +}
diff --git a/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp b/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp new file mode 100644 index 0000000..cbe7daa --- /dev/null +++ b/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp
@@ -0,0 +1,57 @@ +// +// blocking_udp_echo_client.cpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include <cstdlib> +#include <cstring> +#include <iostream> +#include "asio.hpp" + +using asio::ip::udp; + +enum { max_length = 1024 }; + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 3) + { + std::cerr << "Usage: blocking_udp_echo_client <host> <port>\n"; + return 1; + } + + asio::io_service io_service; + + udp::socket s(io_service, udp::endpoint(udp::v4(), 0)); + + udp::resolver resolver(io_service); + udp::endpoint endpoint = *resolver.resolve({udp::v4(), argv[1], argv[2]}); + + std::cout << "Enter message: "; + char request[max_length]; + std::cin.getline(request, max_length); + size_t request_length = std::strlen(request); + s.send_to(asio::buffer(request, request_length), endpoint); + + char reply[max_length]; + udp::endpoint sender_endpoint; + size_t reply_length = s.receive_from( + asio::buffer(reply, max_length), sender_endpoint); + std::cout << "Reply is: "; + std::cout.write(reply, reply_length); + std::cout << "\n"; + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << "\n"; + } + + return 0; +}
diff --git a/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp b/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp new file mode 100644 index 0000000..bdd6ac3 --- /dev/null +++ b/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp
@@ -0,0 +1,52 @@ +// +// blocking_udp_echo_server.cpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#include <cstdlib> +#include <iostream> +#include "asio.hpp" + +using asio::ip::udp; + +enum { max_length = 1024 }; + +void server(asio::io_service& io_service, unsigned short port) +{ + udp::socket sock(io_service, udp::endpoint(udp::v4(), port)); + for (;;) + { + char data[max_length]; + udp::endpoint sender_endpoint; + size_t length = sock.receive_from( + asio::buffer(data, max_length), sender_endpoint); + sock.send_to(asio::buffer(data, length), sender_endpoint); + } +} + +int main(int argc, char* argv[]) +{ + try + { + if (argc != 2) + { + std::cerr << "Usage: blocking_udp_echo_server <port>\n"; + return 1; + } + + asio::io_service io_service; + + server(io_service, std::atoi(argv[1])); + } + catch (std::exception& e) + { + std::cerr << "Exception: " << e.what() << "\n"; + } + + return 0; +}