Browse Source

Make I2PClientTunnel use TCPIPAcceptor

pull/146/head
Francisco Blas (klondike) Izquierdo Riera 10 years ago
parent
commit
56014962d4
  1. 1
      HTTPProxy.h
  2. 1
      I2PService.h
  3. 53
      I2PTunnel.cpp
  4. 16
      I2PTunnel.h

1
HTTPProxy.h

@ -11,7 +11,6 @@ namespace i2p @@ -11,7 +11,6 @@ namespace i2p
{
namespace proxy
{
class HTTPProxyHandler;
class HTTPProxyServer: public i2p::client::TCPIPAcceptor
{
protected:

1
I2PService.h

@ -76,6 +76,7 @@ namespace client @@ -76,6 +76,7 @@ namespace client
std::atomic<bool> m_Dead; //To avoid cleaning up multiple times
};
/* TODO: support IPv6 too */
//This is a service that listens for connections on the IP network and interacts with I2P
class TCPIPAcceptor: public I2PService
{

53
I2PTunnel.cpp

@ -203,29 +203,17 @@ namespace client @@ -203,29 +203,17 @@ namespace client
}
I2PClientTunnel::I2PClientTunnel (const std::string& destination, int port, ClientDestination * localDestination):
I2PService (localDestination),
m_Acceptor (GetService (), boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port)),
m_Timer (GetService ()), m_Destination (destination), m_DestinationIdentHash (nullptr)
{
}
I2PClientTunnel::~I2PClientTunnel ()
{
Stop ();
}
TCPIPAcceptor (port,localDestination), m_Destination (destination), m_DestinationIdentHash (nullptr)
{}
void I2PClientTunnel::Start ()
{
GetIdentHash();
m_Acceptor.listen ();
Accept ();
}
void I2PClientTunnel::Stop ()
{
m_Acceptor.close();
m_Timer.cancel ();
ClearHandlers ();
TCPIPAcceptor::Stop();
auto *originalIdentHash = m_DestinationIdentHash;
m_DestinationIdentHash = nullptr;
delete originalIdentHash;
@ -245,38 +233,13 @@ namespace client @@ -245,38 +233,13 @@ namespace client
return m_DestinationIdentHash;
}
void I2PClientTunnel::Accept ()
{
auto newSocket = new boost::asio::ip::tcp::socket (GetService ());
m_Acceptor.async_accept (*newSocket, std::bind (&I2PClientTunnel::HandleAccept, this,
std::placeholders::_1, newSocket));
}
void I2PClientTunnel::HandleAccept (const boost::system::error_code& ecode, boost::asio::ip::tcp::socket * socket)
std::shared_ptr<I2PServiceHandler> I2PClientTunnel::CreateHandler(boost::asio::ip::tcp::socket * socket)
{
if (!ecode)
{
const i2p::data::IdentHash *identHash = GetIdentHash();
if (identHash)
{
auto connection = std::make_shared<I2PClientTunnelHandler>(this, *identHash, socket);
AddHandler (connection);
connection->Handle ();
}
else
{
LogPrint (eLogError,"Closing socket");
socket->close();
delete socket;
}
Accept ();
}
const i2p::data::IdentHash *identHash = GetIdentHash();
if (identHash)
return std::make_shared<I2PClientTunnelHandler>(this, *identHash, socket);
else
{
LogPrint (eLogError,"Closing socket on accept because: ", ecode.message ());
delete socket;
}
return nullptr;
}
I2PServerTunnel::I2PServerTunnel (const std::string& address, int port, ClientDestination * localDestination):

16
I2PTunnel.h

@ -55,12 +55,18 @@ namespace client @@ -55,12 +55,18 @@ namespace client
bool m_IsQuiet; // don't send destination
};
class I2PClientTunnel: public I2PService
class I2PClientTunnel: public TCPIPAcceptor
{
protected:
// Implements TCPIPAcceptor
std::shared_ptr<I2PServiceHandler> CreateHandler(boost::asio::ip::tcp::socket * socket);
const char* GetName() { return "I2P Client Tunnel"; }
public:
I2PClientTunnel (const std::string& destination, int port, ClientDestination * localDestination = nullptr);
~I2PClientTunnel ();
~I2PClientTunnel () {}
void Start ();
void Stop ();
@ -68,13 +74,7 @@ namespace client @@ -68,13 +74,7 @@ namespace client
private:
const i2p::data::IdentHash * GetIdentHash ();
void Accept ();
void HandleAccept (const boost::system::error_code& ecode, boost::asio::ip::tcp::socket * socket);
private:
boost::asio::ip::tcp::acceptor m_Acceptor;
boost::asio::deadline_timer m_Timer;
std::string m_Destination;
const i2p::data::IdentHash * m_DestinationIdentHash;
};

Loading…
Cancel
Save