File indexing completed on 2026-09-26 09:13:43
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef ROOT_TUDPSocket
0013 #define ROOT_TUDPSocket
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
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),
0042 kBrokenConn = BIT(17)
0043 };
0044 enum EInterest { kRead = 1, kWrite = 2 };
0045 enum EServiceType { kSOCKD, kROOTD };
0046
0047 protected:
0048 TInetAddress fAddress;
0049 UInt_t fBytesRecv;
0050 UInt_t fBytesSent;
0051 Int_t fCompress;
0052 TInetAddress fLocalAddress;
0053 Int_t fRemoteProtocol;
0054 ROOT::Deprecated::TSecContext *fSecContext;
0055
0056 TString fService;
0057 EServiceType fServType;
0058 Int_t fSocket;
0059 TString fUrl;
0060 TBits fBitsInfo;
0061 TList *fUUIDs;
0062
0063 TVirtualMutex *fLastUsageMtx;
0064 TTimeStamp fLastUsage;
0065
0066 static ULong64_t fgBytesRecv;
0067 static ULong64_t fgBytesSent;
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)
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