From 4c2d4009dab26fc4daffb2349e426adeb3636cd6 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 12 May 2016 16:17:10 -0400 Subject: [PATCH] handle protocol byte --- I2CP.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ I2CP.h | 24 ++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/I2CP.cpp b/I2CP.cpp index 77ff06e2..d3e25e99 100644 --- a/I2CP.cpp +++ b/I2CP.cpp @@ -5,6 +5,46 @@ namespace i2p { namespace client { + I2CPSession::I2CPSession (std::shared_ptr socket): + m_Socket (socket) + { + ReadProtocolByte (); + } + + void I2CPSession::ReadProtocolByte () + { + if (m_Socket) + { + auto s = shared_from_this (); + m_Socket->async_read_some (boost::asio::buffer (m_Buffer, 1), + [s](const boost::system::error_code& ecode, std::size_t bytes_transferred) + { + if (!ecode && bytes_transferred > 0 && s->m_Buffer[0] == I2CP_PRTOCOL_BYTE) + s->Receive (); + else + s->Terminate (); + }); + } + } + + void I2CPSession::Receive () + { + m_Socket->async_read_some (boost::asio::buffer (m_Buffer, I2CP_SESSION_BUFFER_SIZE), + std::bind (&I2CPSession::HandleReceived, shared_from_this (), std::placeholders::_1, std::placeholders::_2)); + } + + void I2CPSession::HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred) + { + if (ecode) + Terminate (); + else + Receive (); + } + + void I2CPSession::Terminate () + { + } + I2CPServer::I2CPServer (const std::string& interface, int port) { } diff --git a/I2CP.h b/I2CP.h index c5460c93..e4b94870 100644 --- a/I2CP.h +++ b/I2CP.h @@ -1,13 +1,37 @@ #ifndef I2CP_H__ #define I2CP_H__ +#include #include +#include #include namespace i2p { namespace client { + const uint8_t I2CP_PRTOCOL_BYTE = 0x2A; + const size_t I2CP_SESSION_BUFFER_SIZE = 8192; + + class I2CPSession: public std::enable_shared_from_this + { + public: + + I2CPSession (std::shared_ptr socket); + + private: + + void ReadProtocolByte (); + void Receive (); + void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred); + void Terminate (); + + private: + + std::shared_ptr m_Socket; + uint8_t m_Buffer[I2CP_SESSION_BUFFER_SIZE]; + }; + class I2CPServer { public: