//------------------------------------------------------------------------------ // File: NetworkStream.hh // Author: Georgios Bitzes - CERN //------------------------------------------------------------------------------ /************************************************************************ * qclient - A simple redis C++ client with support for redirects * * Copyright (C) 2016 CERN/Switzerland * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program 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 this program. If not, see .* ************************************************************************/ #ifndef __QCLIENT_NETWORK_STREAM_H__ #define __QCLIENT_NETWORK_STREAM_H__ #include #include #include #include "qclient/TlsFilter.hh" #include "qclient/network/HostResolver.hh" namespace qclient { class NetworkStream { public: //---------------------------------------------------------------------------- // Create a network stream based on an existing socket fd. //---------------------------------------------------------------------------- NetworkStream(int fd, TlsConfig tlsconfig); //---------------------------------------------------------------------------- // Destructor //---------------------------------------------------------------------------- ~NetworkStream(); bool ok() { return isOk; } int getErrno() { return localerrno; } std::string getError() { return error; } int getFd() { return fd; } void shutdown(); RecvStatus recv(char *buff, int len, int timeout); LinkStatus send(const char *buff, int len); private: //---------------------------------------------------------------------------- // Initialize TlsFilter //---------------------------------------------------------------------------- void initializeTlsFliter(const TlsConfig &tlsconfig); std::string host; int port; int localerrno = 0; std::string error; // fd is immutable after construction, safe to access concurrently. int fd = -1; bool fdShutdown = false; std::unique_ptr tlsfilter; std::atomic isOk; void close(); }; } #endif