diff --git a/I2PTunnel.cpp b/I2PTunnel.cpp new file mode 100644 index 00000000..ae265c3b --- /dev/null +++ b/I2PTunnel.cpp @@ -0,0 +1,53 @@ +#include +#include "I2PTunnel.h" + +namespace i2p +{ +namespace stream +{ + I2PTunnelConnection::I2PTunnelConnection (boost::asio::ip::tcp::socket * socket, + const i2p::data::LeaseSet * leaseSet): m_Socket (socket) + { + m_Stream = i2p::stream::CreateStream (*leaseSet); + } + + I2PTunnelConnection::~I2PTunnelConnection () + { + if (m_Stream) + { + m_Stream->Close (); + DeleteStream (m_Stream); + } + + delete m_Socket; + } + + I2PClientTunnel::I2PClientTunnel (boost::asio::io_service& service, const std::string& destination, int port): + m_Service (service), m_Acceptor (m_Service, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port)), + m_Destination (destination), m_RemoteLeaseSet (nullptr) + { + } + + + void I2PClientTunnel::Accept () + { + auto newSocket = new boost::asio::ip::tcp::socket (m_Service); + m_Acceptor.async_accept (*newSocket, boost::bind (&I2PClientTunnel::HandleAccept, this, + boost::asio::placeholders::error, newSocket)); + } + + void I2PClientTunnel::HandleAccept (const boost::system::error_code& ecode, boost::asio::ip::tcp::socket * socket) + { + if (!ecode) + { + if (m_RemoteLeaseSet) + new I2PTunnelConnection (socket, m_RemoteLeaseSet); + else + delete socket; + Accept (); + } + else + delete socket; + } +} +} diff --git a/I2PTunnel.h b/I2PTunnel.h new file mode 100644 index 00000000..62f78a9e --- /dev/null +++ b/I2PTunnel.h @@ -0,0 +1,50 @@ +#ifndef I2PTUNNEL_H__ +#define I2PTUNNEL_H__ + +#include +#include +#include +#include "Identity.h" +#include "Streaming.h" + +namespace i2p +{ +namespace stream +{ + class I2PTunnelConnection + { + public: + + I2PTunnelConnection (boost::asio::ip::tcp::socket * socket, + const i2p::data::LeaseSet * leaseSet); + ~I2PTunnelConnection (); + + private: + + boost::asio::ip::tcp::socket * m_Socket; + Stream * m_Stream; + }; + + class I2PClientTunnel + { + public: + + I2PClientTunnel (boost::asio::io_service& service, const std::string& destination, int port); + + private: + + void Accept (); + void HandleAccept (const boost::system::error_code& ecode, boost::asio::ip::tcp::socket * socket); + + private: + + boost::asio::io_service& m_Service; + boost::asio::ip::tcp::acceptor m_Acceptor; + std::string m_Destination; + i2p::data::IdentHash m_DestinationIdentHash; + const i2p::data::LeaseSet * m_RemoteLeaseSet; + }; +} +} + +#endif diff --git a/Win32/i2pd.vcxproj b/Win32/i2pd.vcxproj index 23e2d28f..20a04ff4 100644 --- a/Win32/i2pd.vcxproj +++ b/Win32/i2pd.vcxproj @@ -44,6 +44,7 @@ + @@ -82,6 +83,7 @@ + @@ -158,4 +160,4 @@ - \ No newline at end of file + diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index e39f958f..672759e3 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -42,6 +42,7 @@ set ( SOURCES aes.cpp Daemon.cpp SOCKS.cpp + I2PTunnel.cpp ) set ( HEADERS @@ -74,6 +75,7 @@ set ( HEADERS aes.h Daemon.h SOCKS.h + I2PTunnel.h ) if (WIN32) diff --git a/filelist.mk b/filelist.mk index 4ebf7c09..78b2daee 100644 --- a/filelist.mk +++ b/filelist.mk @@ -4,14 +4,14 @@ CPP_FILES := CryptoConst.cpp base64.cpp NTCPSession.cpp RouterInfo.cpp Transport RouterContext.cpp NetDb.cpp LeaseSet.cpp Tunnel.cpp TunnelEndpoint.cpp TunnelGateway.cpp \ TransitTunnel.cpp I2NPProtocol.cpp Log.cpp Garlic.cpp HTTPServer.cpp Streaming.cpp Identity.cpp \ SSU.cpp util.cpp Reseed.cpp DaemonLinux.cpp SSUData.cpp i2p.cpp aes.cpp SOCKS.cpp UPnP.cpp \ - TunnelPool.cpp HTTPProxy.cpp AddressBook.cpp Daemon.cpp + TunnelPool.cpp HTTPProxy.cpp AddressBook.cpp Daemon.cpp I2PTunnel.cpp H_FILES := CryptoConst.h base64.h NTCPSession.h RouterInfo.h Transports.h \ RouterContext.h NetDb.h LeaseSet.h Tunnel.h TunnelEndpoint.h TunnelGateway.h \ TransitTunnel.h I2NPProtocol.h Log.h Garlic.h HTTPServer.h Streaming.h Identity.h \ SSU.h util.h Reseed.h DaemonLinux.h SSUData.h i2p.h aes.h SOCKS.h UPnP.h TunnelPool.h \ - HTTPProxy.h AddressBook.h Daemon.h + HTTPProxy.h AddressBook.h Daemon.h I2PTunnel.h OBJECTS = $(addprefix obj/, $(notdir $(CPP_FILES:.cpp=.o)))