mirror of https://github.com/PurpleI2P/i2pd.git
orignal
10 years ago
6 changed files with 126 additions and 3 deletions
@ -0,0 +1,78 @@
@@ -0,0 +1,78 @@
|
||||
#include <boost/bind.hpp> |
||||
#include "Log.h" |
||||
#include "SAM.h" |
||||
|
||||
namespace i2p |
||||
{ |
||||
namespace stream |
||||
{ |
||||
SAMBridge::SAMBridge (int port): |
||||
m_IsRunning (false), m_Thread (nullptr), |
||||
m_Acceptor (m_Service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)), |
||||
m_NewSocket (nullptr) |
||||
{ |
||||
} |
||||
|
||||
SAMBridge::~SAMBridge () |
||||
{ |
||||
Stop (); |
||||
delete m_NewSocket; |
||||
} |
||||
|
||||
void SAMBridge::Start () |
||||
{ |
||||
Accept (); |
||||
m_Thread = new std::thread (std::bind (&SAMBridge::Run, this)); |
||||
} |
||||
|
||||
void SAMBridge::Stop () |
||||
{ |
||||
m_IsRunning = false; |
||||
m_Service.stop (); |
||||
if (m_Thread) |
||||
{ |
||||
m_Thread->join (); |
||||
delete m_Thread; |
||||
m_Thread = nullptr; |
||||
} |
||||
} |
||||
|
||||
void SAMBridge::Run () |
||||
{ |
||||
while (m_IsRunning) |
||||
{ |
||||
try |
||||
{ |
||||
m_Service.run (); |
||||
} |
||||
catch (std::exception& ex) |
||||
{ |
||||
LogPrint ("SAM: ", ex.what ()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void SAMBridge::Accept () |
||||
{ |
||||
m_NewSocket = new boost::asio::ip::tcp::socket (m_Service); |
||||
m_Acceptor.async_accept (*m_NewSocket, boost::bind (&SAMBridge::HandleAccept, this, |
||||
boost::asio::placeholders::error)); |
||||
} |
||||
|
||||
void SAMBridge::HandleAccept(const boost::system::error_code& ecode) |
||||
{ |
||||
if (!ecode) |
||||
{ |
||||
//TODO:
|
||||
} |
||||
else |
||||
{ |
||||
delete m_NewSocket; |
||||
m_NewSocket = nullptr; |
||||
} |
||||
|
||||
if (ecode != boost::asio::error::operation_aborted) |
||||
Accept (); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,40 @@
@@ -0,0 +1,40 @@
|
||||
#ifndef SAM_H__ |
||||
#define SAM_H__ |
||||
|
||||
#include <thread> |
||||
#include <boost/asio.hpp> |
||||
|
||||
namespace i2p |
||||
{ |
||||
namespace stream |
||||
{ |
||||
class SAMBridge |
||||
{ |
||||
public: |
||||
|
||||
SAMBridge (int port); |
||||
~SAMBridge (); |
||||
|
||||
void Start (); |
||||
void Stop (); |
||||
|
||||
private: |
||||
|
||||
void Run (); |
||||
|
||||
void Accept (); |
||||
void HandleAccept(const boost::system::error_code& ecode); |
||||
|
||||
private: |
||||
|
||||
bool m_IsRunning; |
||||
std::thread * m_Thread; |
||||
boost::asio::io_service m_Service; |
||||
boost::asio::ip::tcp::acceptor m_Acceptor; |
||||
boost::asio::ip::tcp::socket * m_NewSocket; |
||||
}; |
||||
} |
||||
} |
||||
|
||||
#endif |
||||
|
Loading…
Reference in new issue