diff options
author | Christian Pointner <equinox@anytun.org> | 2010-01-08 03:48:56 +0000 |
---|---|---|
committer | Christian Pointner <equinox@anytun.org> | 2010-01-08 03:48:56 +0000 |
commit | ff9f5aee4b685b8c705bd39d5768eec75a50c5c2 (patch) | |
tree | 7136ee43b71761ac39a7f95473d8c448d0d0266c /src | |
parent | moved to resolver iterator at onResolve callback functions (diff) |
UDPPacketSource now opens one socket for each resolved endpoint
Diffstat (limited to 'src')
-rw-r--r-- | src/anytun-config.cpp | 2 | ||||
-rw-r--r-- | src/anytun.cpp | 2 | ||||
-rw-r--r-- | src/packetSource.cpp | 34 | ||||
-rw-r--r-- | src/packetSource.h | 6 | ||||
-rw-r--r-- | src/resolver.cpp | 10 | ||||
-rw-r--r-- | src/resolver.h | 8 | ||||
-rw-r--r-- | src/syncServer.cpp | 2 | ||||
-rw-r--r-- | src/syncServer.h | 2 |
8 files changed, 43 insertions, 23 deletions
diff --git a/src/anytun-config.cpp b/src/anytun-config.cpp index 4ef4112..f69e883 100644 --- a/src/anytun-config.cpp +++ b/src/anytun-config.cpp @@ -88,7 +88,7 @@ void createConnection(const PacketSourceEndpoint & remote_end, ConnectionList & sem.up(); } -void createConnectionResolver(const PacketSourceResolverIt& it, ConnectionList & cl, u_int16_t seqSize, SyncQueue & queue, mux_t mux, Semaphore& sem) +void createConnectionResolver(PacketSourceResolverIt& it, ConnectionList & cl, u_int16_t seqSize, SyncQueue & queue, mux_t mux, Semaphore& sem) { createConnection(*it, cl, seqSize, queue, mux, sem); } diff --git a/src/anytun.cpp b/src/anytun.cpp index 200b33d..bdd5b65 100644 --- a/src/anytun.cpp +++ b/src/anytun.cpp @@ -97,7 +97,7 @@ void createConnection(const PacketSourceEndpoint& remote_end, window_size_t seqS #endif } -void createConnectionResolver(const PacketSourceResolverIt& it, window_size_t seqSize, mux_t mux) +void createConnectionResolver(PacketSourceResolverIt& it, window_size_t seqSize, mux_t mux) { createConnection(*it, seqSize, mux); } diff --git a/src/packetSource.cpp b/src/packetSource.cpp index c9a0412..7c66d0f 100644 --- a/src/packetSource.cpp +++ b/src/packetSource.cpp @@ -45,18 +45,36 @@ void PacketSource::waitUntilReady() ready_sem_.down(); } -UDPPacketSource::UDPPacketSource(std::string localaddr, std::string port) : sock_(io_service_) +UDPPacketSource::UDPPacketSource(std::string localaddr, std::string port) { gResolver.resolveUdp(localaddr, port, boost::bind(&UDPPacketSource::onResolve, this, _1), boost::bind(&UDPPacketSource::onError, this, _1), gOpt.getResolvAddrType()); } -void UDPPacketSource::onResolve(const PacketSourceResolverIt& it) +UDPPacketSource::~UDPPacketSource() { - PacketSourceEndpoint e = *it; + std::list<proto::socket*>::iterator it = sockets_.begin(); + for(;it != sockets_.end(); ++it) + delete *it; +} + +void UDPPacketSource::onResolve(PacketSourceResolverIt& it) +{ + while(it != PacketSourceResolverIt()) { + PacketSourceEndpoint e = *it; + cLog.msg(Log::PRIO_NOTICE) << "opening socket: " << e; + + proto::socket* sock = new proto::socket(io_service_); + sock->open(e.protocol()); + if(e.protocol() == proto::v6()) { + boost::asio::ip::v6_only option(true); + sock->set_option(option); + } + sock->bind(e); + sockets_.push_back(sock); + + it++; + } - cLog.msg(Log::PRIO_NOTICE) << "opening socket: " << e; - sock_.open(e.protocol()); - sock_.bind(e); ready_sem_.up(); } @@ -67,11 +85,11 @@ void UDPPacketSource::onError(const std::runtime_error& e) u_int32_t UDPPacketSource::recv(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint& remote) { - return static_cast<u_int32_t>(sock_.receive_from(boost::asio::buffer(buf, len), remote)); + return static_cast<u_int32_t>(sockets_.front()->receive_from(boost::asio::buffer(buf, len), remote)); } void UDPPacketSource::send(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint remote) { - sock_.send_to(boost::asio::buffer(buf, len), remote); + sockets_.front()->send_to(boost::asio::buffer(buf, len), remote); } diff --git a/src/packetSource.h b/src/packetSource.h index f388517..ffc14bf 100644 --- a/src/packetSource.h +++ b/src/packetSource.h @@ -34,6 +34,7 @@ #define ANYTUN_packetSource_h_INCLUDED #include <boost/asio.hpp> +#include <list> #include "datatypes.h" #include "threadUtils.hpp" @@ -62,17 +63,18 @@ public: typedef boost::asio::ip::udp proto; UDPPacketSource(std::string localaddr, std::string port); + ~UDPPacketSource(); u_int32_t recv(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint& remote); void send(u_int8_t* buf, u_int32_t len, PacketSourceEndpoint remote); - void onResolve(const PacketSourceResolverIt& it); + void onResolve(PacketSourceResolverIt& it); void onError(const std::runtime_error& e); private: boost::asio::io_service io_service_; - proto::socket sock_; + std::list<proto::socket*> sockets_; }; #endif diff --git a/src/resolver.cpp b/src/resolver.cpp index 36b2c2e..55371d0 100644 --- a/src/resolver.cpp +++ b/src/resolver.cpp @@ -40,20 +40,20 @@ using ::boost::asio::ip::udp; using ::boost::asio::ip::tcp; template<class Proto> -void waitAndEnqueue(u_int32_t s, const std::string& addr, const std::string& port, boost::function<void(const boost::asio::ip::basic_resolver_iterator<Proto>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r) +void waitAndEnqueue(u_int32_t s, const std::string& addr, const std::string& port, boost::function<void(boost::asio::ip::basic_resolver_iterator<Proto>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r) { cLog.msg(Log::PRIO_ERROR) << "the resolver only supports udp and tcp"; } template<> -void waitAndEnqueue(u_int32_t s, const std::string& addr, const std::string& port, boost::function<void(const boost::asio::ip::basic_resolver_iterator<udp>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r) +void waitAndEnqueue(u_int32_t s, const std::string& addr, const std::string& port, boost::function<void(boost::asio::ip::basic_resolver_iterator<udp>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r) { boost::this_thread::sleep(boost::posix_time::milliseconds(s * 1000)); gResolver.resolveUdp(addr, port, onResolve, onError, r); } template<> -void waitAndEnqueue(u_int32_t s, const std::string& addr, const std::string& port, boost::function<void(const boost::asio::ip::basic_resolver_iterator<tcp>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r) +void waitAndEnqueue(u_int32_t s, const std::string& addr, const std::string& port, boost::function<void(boost::asio::ip::basic_resolver_iterator<tcp>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r) { boost::this_thread::sleep(boost::posix_time::milliseconds(s * 1000)); gResolver.resolveTcp(addr, port, onResolve, onError, r); @@ -61,12 +61,12 @@ void waitAndEnqueue(u_int32_t s, const std::string& addr, const std::string& por template<class Proto> -ResolveHandler<Proto>::ResolveHandler(const std::string& addr, const std::string& port, boost::function<void(const boost::asio::ip::basic_resolver_iterator<Proto>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r) : addr_(addr), port_(port), onResolve_(onResolve), onError_(onError), resolv_addr_type_(r) +ResolveHandler<Proto>::ResolveHandler(const std::string& addr, const std::string& port, boost::function<void(boost::asio::ip::basic_resolver_iterator<Proto>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r) : addr_(addr), port_(port), onResolve_(onResolve), onError_(onError), resolv_addr_type_(r) { } template<class Proto> -void ResolveHandler<Proto>::operator()(const boost::system::error_code& e, const boost::asio::ip::basic_resolver_iterator<Proto> endpointIt) +void ResolveHandler<Proto>::operator()(const boost::system::error_code& e, boost::asio::ip::basic_resolver_iterator<Proto> endpointIt) { if(boost::system::posix_error::success == e) { try { diff --git a/src/resolver.h b/src/resolver.h index ea4a57b..35c2bc4 100644 --- a/src/resolver.h +++ b/src/resolver.h @@ -40,16 +40,16 @@ #include "datatypes.h" #include "threadUtils.hpp" -typedef boost::function<void (const boost::asio::ip::udp::resolver::iterator)> UdpResolveCallback; -typedef boost::function<void (const boost::asio::ip::tcp::resolver::iterator)> TcpResolveCallback; +typedef boost::function<void (boost::asio::ip::udp::resolver::iterator)> UdpResolveCallback; +typedef boost::function<void (boost::asio::ip::tcp::resolver::iterator)> TcpResolveCallback; typedef boost::function<void (std::runtime_error const&)> ErrorCallback; template<class Proto> class ResolveHandler { public: - ResolveHandler(const std::string& addr, const std::string& port, boost::function<void (const boost::asio::ip::basic_resolver_iterator<Proto>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r = ANY); - void operator()(const boost::system::error_code& e, const boost::asio::ip::basic_resolver_iterator<Proto>); + ResolveHandler(const std::string& addr, const std::string& port, boost::function<void (boost::asio::ip::basic_resolver_iterator<Proto>)> const& onResolve, ErrorCallback const& onError, ResolvAddrType r = ANY); + void operator()(const boost::system::error_code& e, boost::asio::ip::basic_resolver_iterator<Proto>); private: std::string addr_; diff --git a/src/syncServer.cpp b/src/syncServer.cpp index ecf9fb4..893ceba 100644 --- a/src/syncServer.cpp +++ b/src/syncServer.cpp @@ -42,7 +42,7 @@ SyncServer::SyncServer(std::string localaddr, std::string port, ConnectCallback gResolver.resolveTcp(localaddr, port, boost::bind(&SyncServer::onResolve, this, _1), boost::bind(&SyncServer::onResolvError, this, _1)); } -void SyncServer::onResolve(const SyncTcpConnection::proto::resolver::iterator& it) +void SyncServer::onResolve(SyncTcpConnection::proto::resolver::iterator& it) { SyncTcpConnection::proto::endpoint e = *it; diff --git a/src/syncServer.h b/src/syncServer.h index dc007d6..3157d15 100644 --- a/src/syncServer.h +++ b/src/syncServer.h @@ -50,7 +50,7 @@ class SyncServer { public: SyncServer(std::string localaddr, std::string port, ConnectCallback onConnect); - void onResolve(const SyncTcpConnection::proto::resolver::iterator& it); + void onResolve(SyncTcpConnection::proto::resolver::iterator& it); void onResolvError(const std::runtime_error& e); void run(); |