diff --git a/chat_networking.hpp b/chat_networking.hpp index 5db8788..902204b 100644 --- a/chat_networking.hpp +++ b/chat_networking.hpp @@ -16,6 +16,9 @@ namespace chat using boost::asio::ip::tcp; + /* receive_policy and send_policy must provide the static methods + * that decide what happens with the incoming / outgoing messages. + * you can read about the exact requirements in check_policy.hpp */ template class client_network_manager { @@ -30,8 +33,8 @@ namespace chat private: asio::io_service& _ios; tcp::socket _socket; - asio::streambuf _isb;//<-------. - asio::streambuf _osb;//<---. | + asio::streambuf _isb;//<-------. input stream + asio::streambuf _osb;//<---. | output stream std::istream _is;//--------|---' std::ostream _os;//--------' @@ -74,12 +77,14 @@ namespace chat /* internal methods */ private: - static void throw_if_error(boost::system::error_code& ec) + /* throws if something went wrong on the network */ + static void throw_if_error(const boost::system::error_code& ec) { if (ec) throw std::runtime_error("Networking error: " + ec.message()); } + /* asynchronously connect to the host epit points to */ void connect(tcp::resolver::iterator epit) { asio::async_connect @@ -91,13 +96,14 @@ namespace chat ); } + /* handles the handshake as defined in the common protocol */ void handshake(boost::system::error_code ec, tcp::resolver::iterator) { throw_if_error(ec); _os << chat_message(message::HELLO); _os << chat_message(message::NEPTUN, _login); - std::reverse(_login.begin(), _login.end()); + std::reverse(_login.begin(), _login.end()); // passw is neptun reversed _os << chat_message(message::PASSW, _login); asio::write(_socket, _osb); // handshake is handled synchronously @@ -110,6 +116,7 @@ namespace chat receive(); // then flow goes to receive-loop } + /* helper method used by handshake() */ std::string receive_message_sync() { boost::system::error_code ec; @@ -122,6 +129,7 @@ namespace chat return data.substr(1); } + /* asynchronously receive a message, and decide what to do with it */ void receive() { asio::async_read_until @@ -133,10 +141,10 @@ namespace chat std::string data; std::getline(_is, data, byte(message::TERM)); - char header = data[0]; - auto content = data.substr(1, data.size()-1); + char header = data[0]; // get command byte + auto content = data.substr(1, data.size()-1); // minus command & term bytes - switch (header) + switch (header) // decide what to do { case byte(message::PING): send(chat_message(message::PONG)); @@ -159,7 +167,7 @@ namespace chat break; } - receive(); + receive(); // receive the next message }); } };