X-Git-Url: https://git.syn-net.org/debian/?a=blobdiff_plain;f=src%2FsyncClient.cpp;h=1da34367ecac34279eb1bcc5cc499d9b76f0a99f;hb=refs%2Fheads%2Fupstream;hp=df99b83a01384d194d2a6595e2f4777d5707b880;hpb=058ae090a970436caec3b3059e9e18b310dd6b0d;p=anytun.git diff --git a/src/syncClient.cpp b/src/syncClient.cpp index df99b83..1da3436 100644 --- a/src/syncClient.cpp +++ b/src/syncClient.cpp @@ -6,19 +6,20 @@ * 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 + * message authentication based on the methods 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, + * Copyright (C) 2007-2014 Markus Grüneis, 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. + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. * * Anytun is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -26,8 +27,22 @@ * 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 . + * along with Anytun. If not, see . + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of portions of this program with the + * OpenSSL library under certain conditions as described in each + * individual source file, and distribute linked combinations + * including the two. + * You must obey the GNU General Public License in all respects + * for all of the code used other than OpenSSL. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you + * do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source + * files in the program, then also delete it here. */ + #include #include #include @@ -46,82 +61,79 @@ SyncClient::SyncClient(std::string hostname,std::string port) -:hostname_( hostname),port_(port) + :hostname_(hostname),port_(port) { } 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; + 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; - readAndProcess(socket); //endless loop - } - 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)); - } - } + 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; + readAndProcess(socket); //endless loop + } 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::readAndProcess(SyncTcpConnection::proto::socket & socket) +void SyncClient::readAndProcess(SyncTcpConnection::proto::socket& socket) { - ConnectionList & cl_ (gConnectionList); - size_t message_lenght ; - for (;;) - { - std::stringstream message_lenght_stream; - readExactly(socket,5,message_lenght_stream); - message_lenght_stream >> message_lenght; - std::stringstream void_stream; - readExactly(socket,1,void_stream); //skip space - std::stringstream sync_command_stream; - readExactly(socket,message_lenght, sync_command_stream); - //cLog.msg(Log::PRIO_NOTICE) << "recieved sync inforamtaion "<> scom; - } + ConnectionList& cl_(gConnectionList); + size_t message_lenght ; + for(;;) { + std::stringstream message_lenght_stream; + readExactly(socket,5,message_lenght_stream); + message_lenght_stream >> message_lenght; + std::stringstream void_stream; + readExactly(socket,1,void_stream); //skip space + std::stringstream sync_command_stream; + readExactly(socket,message_lenght, sync_command_stream); + //cLog.msg(Log::PRIO_NOTICE) << "recieved sync inforamtaion "<> scom; + } } -void SyncClient::readExactly(SyncTcpConnection::proto::socket & socket,size_t toread, std::iostream & result) +void SyncClient::readExactly(SyncTcpConnection::proto::socket& socket,size_t toread, std::iostream& result) { - size_t hasread = 0; - while (toread > hasread) - { - //TODO read bigger buffers - 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. - //for (size_t pos=0; pos hasread) { + //TODO read bigger buffers + 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. + } + //for (size_t pos=0; pos