#ifndef XRC_SOCK_H #define XRC_SOCK_H /******************************************************************************/ /* */ /* X r d C l i e n t S o c k . h h */ /* */ /* Author: Fabrizio Furano (INFN Padova, 2004) */ /* Adapted from TXNetFile (root.cern.ch) originally done by */ /* Alvise Dorigo, Fabrizio Furano */ /* INFN Padova, 2003 */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD is free software: you can redistribute it and/or modify it under */ /* the terms of the GNU Lesser General Public License as published by the */ /* Free Software Foundation, either version 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD 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 Lesser General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public License */ /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ ////////////////////////////////////////////////////////////////////////// // // // Client Socket with timeout features // // // // June 06 - Fabrizio Furano // // The function prototypes allow specializations for multistream xfer // // purposes. In this class only monostream xfers are allowed. // // // ////////////////////////////////////////////////////////////////////////// #include struct XrdClientSockConnectParms { XrdClientUrlInfo TcpHost; int TcpWindowSize; }; class XrdClientSock { public: typedef int Sockid; typedef int Sockdescr; friend class XrdClientPhyConnection; private: int fSocket; protected: int fRequestTimeout; XrdClientSockConnectParms fHost; bool fConnected; bool fRDInterrupt; bool fWRInterrupt; // Tells if we have to reinit the table of the fd selectors // after adding or removing one of them bool fReinit_fd; virtual int SaveSocket() { int fd = fSocket; fSocket = -1; fConnected = 0; fRDInterrupt = 0; fWRInterrupt = 0; return fd; } void SetInterrupt(int which = 0) { if (which == 0 || which == 1) fRDInterrupt = 1; if (which == 0 || which == 2) fWRInterrupt = 1; } // returns the socket descriptor or -1 int TryConnect_low(bool isUnix = 0, int altport = 0, int windowsz = 0); // Send the buffer to the specified socket virtual int SendRaw_sock(const void* buffer, int length, Sockdescr sock); public: //-------------------------------------------------------------------------- //! Construct a socket helper //! //! @param host Remote location to connect to //! @param windowSize TCP window size: 0 for OS defaults or the ENV setting //! @param fd A descriptor pointing to an already connected socket, //! -1 if not available //-------------------------------------------------------------------------- XrdClientSock(XrdClientUrlInfo host, int windowsize = 0, int fd = -1 ); virtual ~XrdClientSock(); virtual void BanSockDescr(Sockdescr, Sockid) {} virtual void UnBanSockDescr(Sockdescr) { } // Makes a pending recvraw to rebuild the list of interesting selectors void ReinitFDTable() { fReinit_fd = true; } // Gets length bytes from the specified substreamid // If substreamid = 0 then use the main stream // If substreamid = -1 then // use any stream which has something pending // and return its id in usedsubstreamid // Note that in this base class only the multistream intf is provided // but the implementation is monostream virtual int RecvRaw(void* buffer, int length, Sockid substreamid = -1, Sockid *usedsubstreamid = 0); // Send the buffer to the specified substream // if substreamid <= 0 then use the main one virtual int SendRaw(const void* buffer, int length, Sockid substreamid = 0); void SetRequestTimeout(int timeout = -1); // Performs a SOCKS4 handshake in a given stream // Returns the handshake result // If successful, we are connected through a socks4 proxy virtual int Socks4Handshake(Sockid sockid); virtual void TryConnect(bool isUnix = 0); // Returns a temporary socket id or -1 // The temporary given sock id is to be used to send the kxr_bind_request // If all this goes ok, then the caller must call EstablishParallelSock, otherwise the // creation of parallel streams should be aborted (but the already created streams are OK) virtual Sockdescr TryConnectParallelSock(int /*port*/, int /*windowsz*/, Sockid &/*tmpid*/) { return -1; } // Attach the pending (and hidden) sock // to the given substreamid // the given substreamid could be an integer suggested by the server virtual int EstablishParallelSock(Sockid /*tmpsockid*/, Sockid /*newsockid*/) { return -1; } virtual int RemoveParallelSock(Sockid /* sockid */) { return -1; }; // Suggests a sockid to be used for a req virtual Sockid GetSockIdHint(int /* reqsperstream */ ) { return 0; } virtual void Disconnect(); bool IsConnected() {return fConnected;} virtual int GetSockIdCount() { return 1; } virtual void PauseSelectOnSubstream(Sockid /* substreamid */) { } virtual void RestartSelectOnSubstream(Sockid /*substreamid */) { } }; #endif