diff --git a/BOB.cpp b/BOB.cpp index ba346daf..c77e03c3 100644 --- a/BOB.cpp +++ b/BOB.cpp @@ -155,10 +155,9 @@ namespace client { if (stream) { - auto conn = std::make_shared (this, stream, new boost::asio::ip::tcp::socket (GetService ()), m_Endpoint); + auto conn = std::make_shared (this, stream, new boost::asio::ip::tcp::socket (GetService ()), m_Endpoint, m_IsQuiet); AddConnection (conn); conn->Connect (); - // TODO: } } diff --git a/I2PTunnel.cpp b/I2PTunnel.cpp index e3790c50..567e1635 100644 --- a/I2PTunnel.cpp +++ b/I2PTunnel.cpp @@ -11,14 +11,15 @@ namespace client { I2PTunnelConnection::I2PTunnelConnection (I2PTunnel * owner, boost::asio::ip::tcp::socket * socket, const i2p::data::LeaseSet * leaseSet): - m_Socket (socket), m_Owner (owner), m_RemoteEndpoint (socket->remote_endpoint ()) + m_Socket (socket), m_Owner (owner), m_RemoteEndpoint (socket->remote_endpoint ()), + m_IsQuiet (true) { m_Stream = m_Owner->GetLocalDestination ()->CreateStream (*leaseSet); } I2PTunnelConnection::I2PTunnelConnection (I2PTunnel * owner, std::shared_ptr stream, - boost::asio::ip::tcp::socket * socket, const boost::asio::ip::tcp::endpoint& target): - m_Socket (socket), m_Stream (stream), m_Owner (owner), m_RemoteEndpoint (target) + boost::asio::ip::tcp::socket * socket, const boost::asio::ip::tcp::endpoint& target, bool quiet): + m_Socket (socket), m_Stream (stream), m_Owner (owner), m_RemoteEndpoint (target), m_IsQuiet (quiet) { } @@ -125,7 +126,16 @@ namespace client else { LogPrint ("I2PTunnel connected"); - StreamReceive (); + if (m_IsQuiet) + StreamReceive (); + else + { + // send destination first like received from I2P + std::string dest = m_Stream->GetRemoteIdentity ().ToBase64 (); + dest += "\n"; + memcpy (m_StreamBuffer, dest.c_str (), dest.size ()); + HandleStreamReceive (boost::system::error_code (), dest.size ()); + } Receive (); } } diff --git a/I2PTunnel.h b/I2PTunnel.h index 990bd867..4f76bf57 100644 --- a/I2PTunnel.h +++ b/I2PTunnel.h @@ -24,9 +24,9 @@ namespace client public: I2PTunnelConnection (I2PTunnel * owner, boost::asio::ip::tcp::socket * socket, - const i2p::data::LeaseSet * leaseSet); + const i2p::data::LeaseSet * leaseSet); // to I2P I2PTunnelConnection (I2PTunnel * owner, std::shared_ptr stream, boost::asio::ip::tcp::socket * socket, - const boost::asio::ip::tcp::endpoint& target); + const boost::asio::ip::tcp::endpoint& target, bool quiet = true); // from I2P ~I2PTunnelConnection (); void I2PConnect (const uint8_t * msg = nullptr, size_t len = 0); @@ -51,6 +51,7 @@ namespace client std::shared_ptr m_Stream; I2PTunnel * m_Owner; boost::asio::ip::tcp::endpoint m_RemoteEndpoint; + bool m_IsQuiet; // don't send destination }; class I2PTunnel