added comments to chat_networking.hpp to promote better understanding

This commit is contained in:
Kjistóf 2016-12-04 15:04:10 +01:00
parent c256a9a928
commit 406c7b2841
1 changed files with 16 additions and 8 deletions

View File

@ -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 receive_policy, class send_policy>
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
});
}
};