Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-26 09:13:43

0001 // @(#)root/net:$Id$
0002 // Author: Marcelo Sousa   26/10/2011
0003 
0004 /*************************************************************************
0005  * Copyright (C) 1995-2011, Rene Brun and Fons Rademakers.               *
0006  * All rights reserved.                                                  *
0007  *                                                                       *
0008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
0009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
0010  *************************************************************************/
0011 
0012 #ifndef ROOT_TUDPSocket
0013 #define ROOT_TUDPSocket
0014 
0015 
0016 //////////////////////////////////////////////////////////////////////////
0017 //                                                                      //
0018 // TUDPSocket                                                           //
0019 //                                                                      //
0020 // This class implements udp client sockets. A socket is an endpoint    //
0021 // for communication between two machines.                              //
0022 // The actual work is done via the TSystem class (either TUnixSystem,   //
0023 // or TWinNTSystem).                                                    //
0024 //                                                                      //
0025 //////////////////////////////////////////////////////////////////////////
0026 
0027 #include "TNamed.h"
0028 #include "TBits.h"
0029 #include "TInetAddress.h"
0030 #include "MessageTypes.h"
0031 #include "TSecContext.h"
0032 #include "TTimeStamp.h"
0033 #include "TVirtualMutex.h"
0034 #include "TSocket.h"
0035 
0036 class TUDPSocket : public TNamed {
0037 
0038 friend class TServerSocket;
0039 
0040 public:
0041    enum EStatusBits { kIsUnix = BIT(16),    // set if unix socket
0042                       kBrokenConn = BIT(17) // set if conn reset by peer or broken
0043                     };
0044    enum EInterest { kRead = 1, kWrite = 2 };
0045    enum EServiceType { kSOCKD, kROOTD };
0046 
0047 protected:
0048    TInetAddress  fAddress;        // remote internet address and port #
0049    UInt_t        fBytesRecv;      // total bytes received over this socket
0050    UInt_t        fBytesSent;      // total bytes sent using this socket
0051    Int_t         fCompress;       // Compression level and algorithm
0052    TInetAddress  fLocalAddress;   // local internet address and port #
0053    Int_t         fRemoteProtocol; // protocol of remote daemon
0054    ROOT::Deprecated::TSecContext  *fSecContext; // after a successful Authenticate call
0055                                                 // points to related security context
0056    TString       fService;        // name of service (matches remote port #)
0057    EServiceType  fServType;       // remote service type
0058    Int_t         fSocket;         // socket descriptor
0059    TString       fUrl;            // needs this for special authentication options
0060    TBits         fBitsInfo;       // bits array to mark TStreamerInfo classes already sent
0061    TList        *fUUIDs;          // list of TProcessIDs already sent through the socket
0062 
0063    TVirtualMutex *fLastUsageMtx;   // Protect last usage setting / reading
0064    TTimeStamp    fLastUsage;      // Time stamp of last usage
0065 
0066    static ULong64_t fgBytesRecv;  // total bytes received by all socket objects
0067    static ULong64_t fgBytesSent;  // total bytes sent by all socket objects
0068 
0069    TUDPSocket() : fAddress(), fBytesRecv(0), fBytesSent(0), fCompress(0),
0070                   fLocalAddress(), fRemoteProtocol(), fSecContext(nullptr), fService(),
0071                   fServType(kSOCKD), fSocket(-1), fUrl(),
0072                   fBitsInfo(), fUUIDs(nullptr), fLastUsageMtx(nullptr), fLastUsage() { }
0073 
0074    void         SetDescriptor(Int_t desc) { fSocket = desc; }
0075    void         SendStreamerInfos(const TMessage &mess);
0076    Bool_t       RecvStreamerInfos(TMessage *mess);
0077    void         SendProcessIDs(const TMessage &mess);
0078    Bool_t       RecvProcessIDs(TMessage *mess);
0079 
0080 private:
0081    TUDPSocket&   operator=(const TUDPSocket &) = delete;
0082    Option_t     *GetOption() const override { return TObject::GetOption(); }
0083 
0084 public:
0085    TUDPSocket(TInetAddress address, const char *service);
0086    TUDPSocket(TInetAddress address, Int_t port);
0087    TUDPSocket(const char *host, const char *service);
0088    TUDPSocket(const char *host, Int_t port);
0089    TUDPSocket(const char *sockpath);
0090 
0091    TUDPSocket(Int_t descriptor);
0092    TUDPSocket(Int_t descriptor, const char *sockpath);
0093    TUDPSocket(const TUDPSocket &s);
0094 
0095    virtual ~TUDPSocket() { Close(); }
0096 
0097    virtual void          Close(Option_t *opt="");
0098    virtual Int_t         GetDescriptor() const { return fSocket; }
0099    TInetAddress          GetInetAddress() const { return fAddress; }
0100    virtual TInetAddress  GetLocalInetAddress();
0101    Int_t                 GetPort() const { return fAddress.GetPort(); }
0102    const char           *GetService() const { return fService; }
0103    Int_t                 GetServType() const { return (Int_t)fServType; }
0104    virtual Int_t         GetLocalPort();
0105    UInt_t                GetBytesSent() const { return fBytesSent; }
0106    UInt_t                GetBytesRecv() const { return fBytesRecv; }
0107    Int_t                 GetCompressionAlgorithm() const;
0108    Int_t                 GetCompressionLevel() const;
0109    Int_t                 GetCompressionSettings() const;
0110    Int_t                 GetErrorCode() const;
0111    virtual Int_t         GetOption(ESockOptions opt, Int_t &val);
0112    Int_t                 GetRemoteProtocol() const { return fRemoteProtocol; }
0113    ROOT::Deprecated::TSecContext *GetSecContext() const
0114       R__DEPRECATED(6, 42, "TUDPSocket::GetSecContext is deprecated") { return fSecContext; }
0115 
0116    TTimeStamp            GetLastUsage() { R__LOCKGUARD2(fLastUsageMtx); return fLastUsage; }
0117    const char           *GetUrl() const { return fUrl; }
0118 
0119    virtual Bool_t        IsValid() const { return fSocket < 0 ? kFALSE : kTRUE; }
0120    virtual Int_t         Recv(TMessage *&mess);
0121    virtual Int_t         Recv(Int_t &status, Int_t &kind);
0122    virtual Int_t         Recv(char *mess, Int_t max);
0123    virtual Int_t         Recv(char *mess, Int_t max, Int_t &kind);
0124    virtual Int_t         RecvRaw(void *buffer, Int_t length, ESendRecvOptions opt = kDefault);
0125    virtual Int_t         Reconnect() { return -1; }
0126    virtual Int_t         Select(Int_t interest = kRead, Long_t timeout = -1);
0127    virtual Int_t         Send(const TMessage &mess);
0128    virtual Int_t         Send(Int_t kind);
0129    virtual Int_t         Send(Int_t status, Int_t kind);
0130    virtual Int_t         Send(const char *mess, Int_t kind = kMESS_STRING);
0131    virtual Int_t         SendObject(const TObject *obj, Int_t kind = kMESS_OBJECT);
0132    virtual Int_t         SendRaw(const void *buffer, Int_t length,
0133                                  ESendRecvOptions opt = kDefault);
0134    void                  SetCompressionAlgorithm(Int_t algorithm = ROOT::RCompressionSetting::EAlgorithm::kUseGlobal);
0135    void                  SetCompressionLevel(Int_t level = ROOT::RCompressionSetting::ELevel::kUseMin);
0136    void                  SetCompressionSettings(Int_t settings = ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault);
0137    virtual Int_t         SetOption(ESockOptions opt, Int_t val);
0138    void                  SetRemoteProtocol(Int_t rproto) { fRemoteProtocol = rproto; }
0139    void                  SetSecContext(ROOT::Deprecated::TSecContext *ctx)
0140       R__DEPRECATED(6, 42, "TUDPSocket::SetSecContext is deprecated"){ fSecContext = ctx; }
0141    void                  SetService(const char *service) { fService = service; }
0142    void                  SetServType(Int_t st) { fServType = (EServiceType)st; }
0143    void                  SetUrl(const char *url) { fUrl = url; }
0144 
0145    void                  Touch() { R__LOCKGUARD2(fLastUsageMtx); fLastUsage.Set(); }
0146 
0147    static ULong64_t      GetSocketBytesSent();
0148    static ULong64_t      GetSocketBytesRecv();
0149 
0150    static void           NetError(const char *where, Int_t error);
0151 
0152    ClassDefOverride(TUDPSocket,0)  //This class implements UDP client sockets
0153 };
0154 
0155 //______________________________________________________________________________
0156 inline Int_t TUDPSocket::GetCompressionAlgorithm() const
0157 {
0158    return (fCompress < 0) ? -1 : fCompress / 100;
0159 }
0160 
0161 //______________________________________________________________________________
0162 inline Int_t TUDPSocket::GetCompressionLevel() const
0163 {
0164    return (fCompress < 0) ? -1 : fCompress % 100;
0165 }
0166 
0167 //______________________________________________________________________________
0168 inline Int_t TUDPSocket::GetCompressionSettings() const
0169 {
0170    return (fCompress < 0) ? -1 : fCompress;
0171 }
0172 
0173 #endif