41 class TSocket :
public TNamed {
43 friend class TServerSocket;
44 friend class TProofServ;
48 enum EStatusBits { kIsUnix = BIT(16),
51 enum EInterest { kRead = 1, kWrite = 2 };
52 enum EServiceType { kSOCKD, kROOTD, kPROOFD };
57 kInvalidStillInList = -2
59 TInetAddress fAddress;
63 TInetAddress fLocalAddress;
64 Int_t fRemoteProtocol;
65 TSecContext *fSecContext;
68 EServiceType fServType;
75 TVirtualMutex *fLastUsageMtx;
76 TTimeStamp fLastUsage;
78 static ULong64_t fgBytesRecv;
79 static ULong64_t fgBytesSent;
81 static Int_t fgClientProtocol;
83 TSocket() : fAddress(), fBytesRecv(0), fBytesSent(0), fCompress(ROOT::RCompressionSetting::EAlgorithm::kUseGlobal),
84 fLocalAddress(), fRemoteProtocol(), fSecContext(0), fService(),
85 fServType(kSOCKD), fSocket(-1), fTcpWindowSize(0), fUrl(),
86 fBitsInfo(), fUUIDs(0), fLastUsageMtx(0), fLastUsage() { }
88 Bool_t Authenticate(
const char *user);
89 void SetDescriptor(Int_t desc) { fSocket = desc; }
90 void SendStreamerInfos(
const TMessage &mess);
91 Bool_t RecvStreamerInfos(TMessage *mess);
92 void SendProcessIDs(
const TMessage &mess);
93 Bool_t RecvProcessIDs(TMessage *mess);
94 void MarkBrokenConnection();
97 TSocket& operator=(
const TSocket &);
98 Option_t *GetOption()
const {
return TObject::GetOption(); }
101 TSocket(TInetAddress address,
const char *service, Int_t tcpwindowsize = -1);
102 TSocket(TInetAddress address, Int_t port, Int_t tcpwindowsize = -1);
103 TSocket(
const char *host,
const char *service, Int_t tcpwindowsize = -1);
104 TSocket(
const char *host, Int_t port, Int_t tcpwindowsize = -1);
105 TSocket(
const char *sockpath);
106 TSocket(Int_t descriptor);
107 TSocket(Int_t descriptor,
const char *sockpath);
108 TSocket(
const TSocket &s);
109 virtual ~TSocket() { Close(); }
111 virtual void Close(Option_t *opt=
"");
112 virtual Int_t GetDescriptor()
const {
return fSocket; }
113 TInetAddress GetInetAddress()
const {
return fAddress; }
114 virtual TInetAddress GetLocalInetAddress();
115 Int_t GetPort()
const {
return fAddress.GetPort(); }
116 const char *GetService()
const {
return fService; }
117 Int_t GetServType()
const {
return (Int_t)fServType; }
118 virtual Int_t GetLocalPort();
119 UInt_t GetBytesSent()
const {
return fBytesSent; }
120 UInt_t GetBytesRecv()
const {
return fBytesRecv; }
121 Int_t GetCompressionAlgorithm()
const;
122 Int_t GetCompressionLevel()
const;
123 Int_t GetCompressionSettings()
const;
124 Int_t GetErrorCode()
const;
125 virtual Int_t GetOption(ESockOptions opt, Int_t &val);
126 Int_t GetRemoteProtocol()
const {
return fRemoteProtocol; }
127 TSecContext *GetSecContext()
const {
return fSecContext; }
128 Int_t GetTcpWindowSize()
const {
return fTcpWindowSize; }
129 TTimeStamp GetLastUsage() { R__LOCKGUARD2(fLastUsageMtx);
return fLastUsage; }
130 const char *GetUrl()
const {
return fUrl; }
131 virtual Bool_t IsAuthenticated()
const {
return fSecContext ? kTRUE : kFALSE; }
132 virtual Bool_t IsValid()
const {
return fSocket < 0 ? kFALSE : kTRUE; }
133 virtual Int_t Recv(TMessage *&mess);
134 virtual Int_t Recv(Int_t &status, Int_t &kind);
135 virtual Int_t Recv(
char *mess, Int_t max);
136 virtual Int_t Recv(
char *mess, Int_t max, Int_t &kind);
137 virtual Int_t RecvRaw(
void *buffer, Int_t length, ESendRecvOptions opt = kDefault);
138 virtual Int_t Reconnect() {
return -1; }
139 virtual Int_t Select(Int_t interest = kRead, Long_t timeout = -1);
140 virtual Int_t Send(
const TMessage &mess);
141 virtual Int_t Send(Int_t kind);
142 virtual Int_t Send(Int_t status, Int_t kind);
143 virtual Int_t Send(
const char *mess, Int_t kind = kMESS_STRING);
144 virtual Int_t SendObject(
const TObject *obj, Int_t kind = kMESS_OBJECT);
145 virtual Int_t SendRaw(
const void *buffer, Int_t length,
146 ESendRecvOptions opt = kDefault);
147 void SetCompressionAlgorithm(Int_t algorithm = ROOT::RCompressionSetting::EAlgorithm::kUseGlobal);
148 void SetCompressionLevel(Int_t level = ROOT::RCompressionSetting::ELevel::kUseMin);
149 void SetCompressionSettings(Int_t settings = ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault);
150 virtual Int_t SetOption(ESockOptions opt, Int_t val);
151 void SetRemoteProtocol(Int_t rproto) { fRemoteProtocol = rproto; }
152 void SetSecContext(TSecContext *ctx) { fSecContext = ctx; }
153 void SetService(
const char *service) { fService = service; }
154 void SetServType(Int_t st) { fServType = (EServiceType)st; }
155 void SetUrl(
const char *url) { fUrl = url; }
157 void Touch() { R__LOCKGUARD2(fLastUsageMtx); fLastUsage.Set(); }
159 static Int_t GetClientProtocol();
161 static ULong64_t GetSocketBytesSent();
162 static ULong64_t GetSocketBytesRecv();
164 static TSocket *CreateAuthSocket(
const char *user,
const char *host,
165 Int_t port, Int_t size = 0,
166 Int_t tcpwindowsize = -1, TSocket *s = 0, Int_t *err = 0);
167 static TSocket *CreateAuthSocket(
const char *url, Int_t size = 0,
168 Int_t tcpwindowsize = -1, TSocket *s = 0, Int_t *err = 0);
169 static void NetError(
const char *where, Int_t error);
175 inline Int_t TSocket::GetCompressionAlgorithm()
const
177 return (fCompress < 0) ? -1 : fCompress / 100;
181 inline Int_t TSocket::GetCompressionLevel()
const
183 return (fCompress < 0) ? -1 : fCompress % 100;
187 inline Int_t TSocket::GetCompressionSettings()
const
189 return (fCompress < 0) ? -1 : fCompress;