File indexing completed on 2025-11-04 10:28:10
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009 
0010 
0011 
0012 #ifndef ROOT_TSocket
0013 #define ROOT_TSocket
0014 
0015 
0016 
0017 
0018 
0019 
0020 
0021 
0022 
0023 
0024 
0025 
0026 
0027 #include "TSystem.h"
0028 #include "Compression.h"
0029 #include "TNamed.h"
0030 #include "TBits.h"
0031 #include "TInetAddress.h"
0032 #include "MessageTypes.h"
0033 #include "TVirtualAuth.h"
0034 #include "TSecContext.h"
0035 #include "TTimeStamp.h"
0036 #include "TVirtualMutex.h"
0037 
0038 class TMessage;
0039 class THostAuth;
0040 
0041 class TSocket : public TNamed {
0042 
0043 friend class TServerSocket;
0044 friend class TProofServ;   
0045 friend class TSlave;       
0046 
0047 public:
0048    enum EStatusBits { kIsUnix = BIT(16),    
0049                       kBrokenConn = BIT(17) 
0050                     };
0051    enum EInterest { kRead = 1, kWrite = 2 };
0052    enum EServiceType { kSOCKD, kROOTD, kPROOFD };
0053 
0054 protected:
0055    enum ESocketErrors {
0056      kInvalid = -1,
0057      kInvalidStillInList = -2
0058    };
0059    TInetAddress  fAddress;        
0060    UInt_t        fBytesRecv;      
0061    UInt_t        fBytesSent;      
0062    Int_t         fCompress;       
0063    TInetAddress  fLocalAddress;   
0064    Int_t         fRemoteProtocol; 
0065    TSecContext  *fSecContext;     
0066                                   
0067    TString       fService;        
0068    EServiceType  fServType;       
0069    Int_t         fSocket;         
0070    Int_t         fTcpWindowSize;  
0071    TString       fUrl;            
0072    TBits         fBitsInfo;       
0073    TList        *fUUIDs;          
0074 
0075    TVirtualMutex *fLastUsageMtx;  
0076    TTimeStamp    fLastUsage;      
0077 
0078    static ULong64_t fgBytesRecv;  
0079    static ULong64_t fgBytesSent;  
0080 
0081    static Int_t  fgClientProtocol; 
0082 
0083    TSocket() : fAddress(), fBytesRecv(0), fBytesSent(0), fCompress(ROOT::RCompressionSetting::EAlgorithm::kUseGlobal),
0084                fLocalAddress(), fRemoteProtocol(), fSecContext(nullptr), fService(),
0085                fServType(kSOCKD), fSocket(-1), fTcpWindowSize(0), fUrl(),
0086                fBitsInfo(), fUUIDs(nullptr), fLastUsageMtx(nullptr), fLastUsage() {}
0087 
0088    Bool_t       Authenticate(const char *user);
0089    void         SetDescriptor(Int_t desc) { fSocket = desc; }
0090    void         SendStreamerInfos(const TMessage &mess);
0091    Bool_t       RecvStreamerInfos(TMessage *mess);
0092    void         SendProcessIDs(const TMessage &mess);
0093    Bool_t       RecvProcessIDs(TMessage *mess);
0094    void         MarkBrokenConnection();
0095 
0096 private:
0097    TSocket&      operator=(const TSocket &) = delete;
0098    Option_t     *GetOption() const override { return TObject::GetOption(); }
0099 
0100 public:
0101    TSocket(TInetAddress address, const char *service, Int_t tcpwindowsize = -1);
0102    TSocket(TInetAddress address, Int_t port, Int_t tcpwindowsize = -1);
0103    TSocket(const char *host, const char *service, Int_t tcpwindowsize = -1);
0104    TSocket(const char *host, Int_t port, Int_t tcpwindowsize = -1);
0105    TSocket(const char *sockpath);
0106    TSocket(Int_t descriptor);
0107    TSocket(Int_t descriptor, const char *sockpath);
0108    TSocket(const TSocket &s);
0109    virtual ~TSocket() { Close(); }
0110 
0111    virtual void          Close(Option_t *opt="");
0112    virtual Int_t         GetDescriptor() const { return fSocket; }
0113    TInetAddress          GetInetAddress() const { return fAddress; }
0114    virtual TInetAddress  GetLocalInetAddress();
0115    Int_t                 GetPort() const { return fAddress.GetPort(); }
0116    const char           *GetService() const { return fService; }
0117    Int_t                 GetServType() const { return (Int_t)fServType; }
0118    virtual Int_t         GetLocalPort();
0119    UInt_t                GetBytesSent() const { return fBytesSent; }
0120    UInt_t                GetBytesRecv() const { return fBytesRecv; }
0121    Int_t                 GetCompressionAlgorithm() const;
0122    Int_t                 GetCompressionLevel() const;
0123    Int_t                 GetCompressionSettings() const;
0124    Int_t                 GetErrorCode() const;
0125    virtual Int_t         GetOption(ESockOptions opt, Int_t &val);
0126    Int_t                 GetRemoteProtocol() const { return fRemoteProtocol; }
0127    TSecContext          *GetSecContext() const { return fSecContext; }
0128    Int_t                 GetTcpWindowSize() const { return fTcpWindowSize; }
0129    TTimeStamp            GetLastUsage() { R__LOCKGUARD2(fLastUsageMtx); return fLastUsage; }
0130    const char           *GetUrl() const { return fUrl.Data(); }
0131    virtual Bool_t        IsAuthenticated() const { return fSecContext ? kTRUE : kFALSE; }
0132    virtual Bool_t        IsValid() const { return fSocket < 0 ? kFALSE : kTRUE; }
0133    virtual Int_t         Recv(TMessage *&mess);
0134    virtual Int_t         Recv(Int_t &status, Int_t &kind);
0135    virtual Int_t         Recv(char *mess, Int_t max);
0136    virtual Int_t         Recv(char *mess, Int_t max, Int_t &kind);
0137    virtual Int_t         RecvRaw(void *buffer, Int_t length, ESendRecvOptions opt = kDefault);
0138    virtual Int_t         Reconnect() { return -1; }
0139    virtual Int_t         Select(Int_t interest = kRead, Long_t timeout = -1);
0140    virtual Int_t         Send(const TMessage &mess);
0141    virtual Int_t         Send(Int_t kind);
0142    virtual Int_t         Send(Int_t status, Int_t kind);
0143    virtual Int_t         Send(const char *mess, Int_t kind = kMESS_STRING);
0144    virtual Int_t         SendObject(const TObject *obj, Int_t kind = kMESS_OBJECT);
0145    virtual Int_t         SendRaw(const void *buffer, Int_t length,
0146                                  ESendRecvOptions opt = kDefault);
0147    void                  SetCompressionAlgorithm(Int_t algorithm = ROOT::RCompressionSetting::EAlgorithm::kUseGlobal);
0148    void                  SetCompressionLevel(Int_t level = ROOT::RCompressionSetting::ELevel::kUseMin);
0149    void                  SetCompressionSettings(Int_t settings = ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault);
0150    virtual Int_t         SetOption(ESockOptions opt, Int_t val);
0151    void                  SetRemoteProtocol(Int_t rproto) { fRemoteProtocol = rproto; }
0152    void                  SetSecContext(TSecContext *ctx) { fSecContext = ctx; }
0153    void                  SetService(const char *service) { fService = service; }
0154    void                  SetServType(Int_t st) { fServType = (EServiceType)st; }
0155    void                  SetUrl(const char *url) { fUrl = url; }
0156 
0157    void                  Touch() { R__LOCKGUARD2(fLastUsageMtx); fLastUsage.Set(); }
0158 
0159    static Int_t          GetClientProtocol();
0160 
0161    static ULong64_t      GetSocketBytesSent();
0162    static ULong64_t      GetSocketBytesRecv();
0163 
0164    static TSocket       *CreateAuthSocket(const char *user, const char *host,
0165                                           Int_t port, Int_t size = 0,
0166                                           Int_t tcpwindowsize = -1, TSocket *s = nullptr, Int_t *err = nullptr);
0167    static TSocket       *CreateAuthSocket(const char *url, Int_t size = 0,
0168                                           Int_t tcpwindowsize = -1, TSocket *s = nullptr, Int_t *err = nullptr);
0169    static void           NetError(const char *where, Int_t error);
0170 
0171    ClassDefOverride(TSocket,0)  
0172 };
0173 
0174 
0175 inline Int_t TSocket::GetCompressionAlgorithm() const
0176 {
0177    return (fCompress < 0) ? -1 : fCompress / 100;
0178 }
0179 
0180 
0181 inline Int_t TSocket::GetCompressionLevel() const
0182 {
0183    return (fCompress < 0) ? -1 : fCompress % 100;
0184 }
0185 
0186 
0187 inline Int_t TSocket::GetCompressionSettings() const
0188 {
0189    return (fCompress < 0) ? -1 : fCompress;
0190 }
0191 
0192 #endif