/* * anytun * * The secure anycast tunneling protocol (satp) defines a protocol used * for communication between any combination of unicast and anycast * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel * mode and allows tunneling of every ETHER TYPE protocol (e.g. * ethernet, ip, arp ...). satp directly includes cryptography and * message authentication based on the methodes used by SRTP. It is * intended to deliver a generic, scaleable and secure solution for * tunneling and relaying of packets of any protocol. * * * Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl, * Christian Pointner * * This file is part of Anytun. * * Anytun is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * Anytun is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with anytun. If not, see . */ #include #include #include #include #include #include "log.h" //#include "connectionParam.h" #include "syncClient.h" #include "syncTcpConnection.h" #include "buffer.h" #include SyncClient::SyncClient(std::string hostname,std::string port) :hostname_( hostname),port_(port),missing_chars(-1) { } void SyncClient::run() { bool connected(false); for(;;) { try { boost::asio::io_service io_service; SyncTcpConnection::proto::resolver resolver(io_service); SyncTcpConnection::proto::resolver::query query( hostname_, port_); SyncTcpConnection::proto::resolver::iterator endpoint_iterator = resolver.resolve(query); SyncTcpConnection::proto::resolver::iterator end; SyncTcpConnection::proto::socket socket(io_service); boost::system::error_code error = boost::asio::error::host_not_found; while (error && endpoint_iterator != end) { socket.close(); socket.connect(*endpoint_iterator++, error); } if (error) throw boost::system::system_error(error); if (!connected) cLog.msg(Log::PRIO_NOTICE) << "sync: connected to " << hostname_ <<":"<< port_; connected=true; for (;;) { boost::array buf; boost::system::error_code error; size_t len = socket.read_some(boost::asio::buffer(buf), error); if (error == boost::asio::error::eof) break; // Connection closed cleanly by peer. else if (error) throw boost::system::system_error(error); // Some other error. OnRawData(buf.data(), len); } } catch (std::exception& e) { if (connected) cLog.msg(Log::PRIO_NOTICE) << "sync: connection to " << hostname_ <<":"<< port_<< " lost ("<< e.what() << ") retrying every 10sec"; connected=false; boost::this_thread::sleep(boost::posix_time::milliseconds(10000)); } } } void SyncClient::OnRawData(const char *buf,size_t len) //void SyncClientSocket::OnLine(const std::string& line) { ConnectionList & cl_ (gConnectionList); for(size_t index=0;index5) { char * buffer = new char [6+1]; iss_.read(buffer,6); std::stringstream tmp; tmp.write(buffer,6); tmp>>missing_chars; // cLog.msg(Log::PRIO_NOTICE) << "recieved sync inforamtaion "<0 && missing_chars<=buffer_size_) { char * buffer = new char [missing_chars+1]; iss_.read(buffer,missing_chars); std::stringstream tmp; tmp.write(buffer,missing_chars); // cLog.msg(Log::PRIO_NOTICE) << "recieved sync inforamtaion from " << GetRemoteHostname() <<" \""<> scom; buffer_size_-=missing_chars; missing_chars=-1; delete[] buffer; } else break; } //u_int16_t mux = scom.getMux(); //const ConnectionParam & conn = cl_.getConnection(mux)->second; //cLog.msg(Log::PRIO_NOTICE) << "sync connection #"<