| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #include <boost/asio/write.hpp>
- #include <boost/bind.hpp>
- #include "connection.h"
- connection::connection(boost::asio::io_service& ioService, const context& context) :
- m_ioService(ioService),
- m_socket(ioService),
- m_protocol(context)
- {
- }
- boost::asio::ip::tcp::socket& connection::socket()
- {
- return m_socket;
- }
- void connection::start()
- {
- start_write(m_protocol.openConnection(m_socket.remote_endpoint().address().to_string()).second);
- }
- void connection::start_read()
- {
- m_socket.async_read_some(boost::asio::buffer(m_data), boost::bind(&connection::handle_read, this, _1, _2));
- }
- void connection::handle_read(const boost::system::error_code& ec, std::size_t length)
- {
- if (!ec)
- {
- protocol::result result = m_protocol.processMessage(std::string(m_data.begin(), m_data.begin() + length));
- if (result.second.size() > 0)
- start_write(result.second);
- else
- start_read();
- if (result.first == protocol::state::disconnected)
- m_socket.close();
- }
- }
- void connection::start_write(const std::string& message)
- {
- std::copy(message.begin(), message.end(), m_data.data());
- size_t length = message.size() + 1;
- m_data[message.size()] = '\n';
- boost::asio::async_write(m_socket, boost::asio::buffer(m_data, length), boost::bind(&connection::handle_write, this, _1));
- }
- void connection::handle_write(const boost::system::error_code& ec)
- {
- if (!ec)
- start_read();
- }
|