diff --git a/boost_boilerplate/CMakeLists.txt b/boost_boilerplate/CMakeLists.txt index 3bdf878..ca287b3 100644 --- a/boost_boilerplate/CMakeLists.txt +++ b/boost_boilerplate/CMakeLists.txt @@ -88,3 +88,8 @@ add_executable(writing_tcp_async src/chapter02_io/writing_tcp_async.cpp src/sdk.h) target_link_libraries(writing_tcp_async PRIVATE Threads::Threads) + +add_executable(reading_tcp_async + src/chapter02_io/reading_tcp_async.cpp + src/sdk.h) +target_link_libraries(reading_tcp_async PRIVATE Threads::Threads) diff --git a/boost_boilerplate/src/chapter02_io/reading_tcp_async.cpp b/boost_boilerplate/src/chapter02_io/reading_tcp_async.cpp new file mode 100644 index 0000000..db51fb3 --- /dev/null +++ b/boost_boilerplate/src/chapter02_io/reading_tcp_async.cpp @@ -0,0 +1,77 @@ +#include +#include +#include + +using namespace boost; +using namespace std; +namespace sys = boost::system; +namespace net = boost::asio; + +struct session +{ + std::shared_ptr sock; + unique_ptr buf; + size_t total_bytes_read; + uint32_t buf_size; +}; + +void Callback(const boost::system::error_code& ec, + size_t bytes_transferred, + std::shared_ptr s) +{ + if (ec) + { + cout << "Error!"s << ec.value() << " "s << ec.what() << endl; + + return; + } + + s->total_bytes_read += bytes_transferred; + + if (s->total_bytes_read == s->buf_size) return; + + s->sock->async_read_some(asio::buffer(s->buf.get() + s->total_bytes_read, + s->buf_size - s->total_bytes_read), + std::bind(Callback, placeholders::_1, placeholders::_2, s)); +} + +void ReadFromSocket(std::shared_ptr sock) +{ + auto s = make_unique(); + + const uint32_t message_size = 7; + + s->buf.reset(new char [message_size]); + s->total_bytes_read = 0; + s->sock = sock; + s->buf_size = message_size; + + s->sock->async_read_some(net::buffer(s->buf.get(), s->buf_size), + std::bind(Callback, placeholders::_1, placeholders::_2, s)); +} + +int main() +{ + string raw_ip_address = "127.0.0.1"s; + unsigned short port_num = 3333; + + try + { + net::ip::tcp::endpoint ep(net::ip::address::from_string(raw_ip_address), port_num); + net::io_context ios; + + auto sock = make_shared(ios, ep.protocol()); + + sock->connect(ep); + + ReadFromSocket(sock); + + ios.run(); + } + catch (const sys::system_error& e) + { + cout << "Error!" << e.what() << endl; + } + + return EXIT_SUCCESS; +} diff --git a/boost_boilerplate/src/chapter02_io/writing_tcp_async.cpp b/boost_boilerplate/src/chapter02_io/writing_tcp_async.cpp index d55b62a..8f59e78 100644 --- a/boost_boilerplate/src/chapter02_io/writing_tcp_async.cpp +++ b/boost_boilerplate/src/chapter02_io/writing_tcp_async.cpp @@ -11,7 +11,7 @@ struct session { std::shared_ptr sock; string buf; - size_t total_bytes_written; + size_t total_bytes_read; }; void callback(const sys::error_code& ec, @@ -25,15 +25,15 @@ void callback(const sys::error_code& ec, return; } - s->total_bytes_written += bytes_transferred; + s->total_bytes_read += bytes_transferred; - if (s->total_bytes_written == s->buf.length()) + if (s->total_bytes_read == s->buf.length()) { return; } - s->sock->async_write_some(net::buffer(s->buf.c_str() + s->total_bytes_written, - s->buf.length() - s->total_bytes_written), + s->sock->async_write_some(net::buffer(s->buf.c_str() + s->total_bytes_read, + s->buf.length() - s->total_bytes_read), std::bind(callback, placeholders::_1, placeholders::_2, s)); } @@ -42,7 +42,7 @@ void WriteToSocket(std::shared_ptr sock) auto s = make_shared(); s->buf = string {"Hello"}; - s->total_bytes_written = 0; + s->total_bytes_read = 0; s->sock = sock; s->sock->async_write_some(