00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOT_TSocket
00013 #define ROOT_TSocket
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef ROOT_TNamed
00028 #include "TNamed.h"
00029 #endif
00030 #ifndef ROOT_TBits
00031 #include "TBits.h"
00032 #endif
00033 #ifndef ROOT_TInetAddress
00034 #include "TInetAddress.h"
00035 #endif
00036 #ifndef ROOT_MessageTypes
00037 #include "MessageTypes.h"
00038 #endif
00039 #ifndef ROOT_TVirtualAuth
00040 #include "TVirtualAuth.h"
00041 #endif
00042 #ifndef ROOT_TSecContext
00043 #include "TSecContext.h"
00044 #endif
00045 #ifndef ROOT_TTimeStamp
00046 #include "TTimeStamp.h"
00047 #endif
00048 #ifndef ROOT_TVirtualMutex
00049 #include "TVirtualMutex.h"
00050 #endif
00051
00052 enum ESockOptions {
00053 kSendBuffer,
00054 kRecvBuffer,
00055 kOobInline,
00056 kKeepAlive,
00057 kReuseAddr,
00058 kNoDelay,
00059 kNoBlock,
00060 kProcessGroup,
00061 kAtMark,
00062 kBytesToRead
00063 };
00064
00065 enum ESendRecvOptions {
00066 kDefault,
00067 kOob,
00068 kPeek,
00069 kDontBlock
00070 };
00071
00072
00073 class TMessage;
00074 class THostAuth;
00075
00076 class TSocket : public TNamed {
00077
00078 friend class TServerSocket;
00079 friend class TProofServ;
00080 friend class TSlave;
00081
00082 public:
00083 enum EStatusBits { kIsUnix = BIT(16) };
00084 enum EInterest { kRead = 1, kWrite = 2 };
00085 enum EServiceType { kSOCKD, kROOTD, kPROOFD };
00086
00087 protected:
00088 TInetAddress fAddress;
00089 UInt_t fBytesRecv;
00090 UInt_t fBytesSent;
00091 Int_t fCompress;
00092
00093 TInetAddress fLocalAddress;
00094 Int_t fRemoteProtocol;
00095 TSecContext *fSecContext;
00096
00097 TString fService;
00098 EServiceType fServType;
00099 Int_t fSocket;
00100 Int_t fTcpWindowSize;
00101 TString fUrl;
00102 TBits fBitsInfo;
00103 TList *fUUIDs;
00104
00105 TVirtualMutex *fLastUsageMtx;
00106 TTimeStamp fLastUsage;
00107
00108 static ULong64_t fgBytesRecv;
00109 static ULong64_t fgBytesSent;
00110
00111 static Int_t fgClientProtocol;
00112
00113 TSocket() : fAddress(), fBytesRecv(0), fBytesSent(0), fCompress(0),
00114 fLocalAddress(), fRemoteProtocol(), fSecContext(0), fService(),
00115 fServType(kSOCKD), fSocket(-1), fTcpWindowSize(0), fUrl(),
00116 fBitsInfo(), fUUIDs(0), fLastUsageMtx(0), fLastUsage() { }
00117
00118 Bool_t Authenticate(const char *user);
00119 void SetDescriptor(Int_t desc) { fSocket = desc; }
00120 void SendStreamerInfos(const TMessage &mess);
00121 Bool_t RecvStreamerInfos(TMessage *mess);
00122 void SendProcessIDs(const TMessage &mess);
00123 Bool_t RecvProcessIDs(TMessage *mess);
00124
00125 private:
00126 TSocket& operator=(const TSocket &);
00127 Option_t *GetOption() const { return TObject::GetOption(); }
00128
00129 public:
00130 TSocket(TInetAddress address, const char *service, Int_t tcpwindowsize = -1);
00131 TSocket(TInetAddress address, Int_t port, Int_t tcpwindowsize = -1);
00132 TSocket(const char *host, const char *service, Int_t tcpwindowsize = -1);
00133 TSocket(const char *host, Int_t port, Int_t tcpwindowsize = -1);
00134 TSocket(const char *sockpath);
00135 TSocket(Int_t descriptor);
00136 TSocket(Int_t descriptor, const char *sockpath);
00137 TSocket(const TSocket &s);
00138 virtual ~TSocket() { Close(); }
00139
00140 virtual void Close(Option_t *opt="");
00141 virtual Int_t GetDescriptor() const { return fSocket; }
00142 TInetAddress GetInetAddress() const { return fAddress; }
00143 virtual TInetAddress GetLocalInetAddress();
00144 Int_t GetPort() const { return fAddress.GetPort(); }
00145 const char *GetService() const { return fService; }
00146 Int_t GetServType() const { return (Int_t)fServType; }
00147 virtual Int_t GetLocalPort();
00148 UInt_t GetBytesSent() const { return fBytesSent; }
00149 UInt_t GetBytesRecv() const { return fBytesRecv; }
00150 Int_t GetCompressionLevel() const { return fCompress; }
00151 Int_t GetErrorCode() const;
00152 virtual Int_t GetOption(ESockOptions opt, Int_t &val);
00153 Int_t GetRemoteProtocol() const { return fRemoteProtocol; }
00154 TSecContext *GetSecContext() const { return fSecContext; }
00155 Int_t GetTcpWindowSize() const { return fTcpWindowSize; }
00156 TTimeStamp GetLastUsage() { R__LOCKGUARD2(fLastUsageMtx); return fLastUsage; }
00157 const char *GetUrl() const { return fUrl; }
00158 virtual Bool_t IsAuthenticated() const { return fSecContext ? kTRUE : kFALSE; }
00159 virtual Bool_t IsValid() const { return fSocket < 0 ? kFALSE : kTRUE; }
00160 virtual Int_t Recv(TMessage *&mess);
00161 virtual Int_t Recv(Int_t &status, Int_t &kind);
00162 virtual Int_t Recv(char *mess, Int_t max);
00163 virtual Int_t Recv(char *mess, Int_t max, Int_t &kind);
00164 virtual Int_t RecvRaw(void *buffer, Int_t length, ESendRecvOptions opt = kDefault);
00165 virtual Int_t Reconnect() { return -1; }
00166 virtual Int_t Select(Int_t interest = kRead, Long_t timeout = -1);
00167 virtual Int_t Send(const TMessage &mess);
00168 virtual Int_t Send(Int_t kind);
00169 virtual Int_t Send(Int_t status, Int_t kind);
00170 virtual Int_t Send(const char *mess, Int_t kind = kMESS_STRING);
00171 virtual Int_t SendObject(const TObject *obj, Int_t kind = kMESS_OBJECT);
00172 virtual Int_t SendRaw(const void *buffer, Int_t length,
00173 ESendRecvOptions opt = kDefault);
00174 void SetCompressionLevel(Int_t level = 1);
00175 virtual Int_t SetOption(ESockOptions opt, Int_t val);
00176 void SetRemoteProtocol(Int_t rproto) { fRemoteProtocol = rproto; }
00177 void SetSecContext(TSecContext *ctx) { fSecContext = ctx; }
00178 void SetService(const char *service) { fService = service; }
00179 void SetServType(Int_t st) { fServType = (EServiceType)st; }
00180 void SetUrl(const char *url) { fUrl = url; }
00181
00182 void Touch() { R__LOCKGUARD2(fLastUsageMtx); fLastUsage.Set(); }
00183
00184 static Int_t GetClientProtocol();
00185
00186 static ULong64_t GetSocketBytesSent();
00187 static ULong64_t GetSocketBytesRecv();
00188
00189 static TSocket *CreateAuthSocket(const char *user, const char *host,
00190 Int_t port, Int_t size = 0,
00191 Int_t tcpwindowsize = -1, TSocket *s = 0);
00192 static TSocket *CreateAuthSocket(const char *url, Int_t size = 0,
00193 Int_t tcpwindowsize = -1, TSocket *s = 0);
00194 static void NetError(const char *where, Int_t error);
00195
00196 ClassDef(TSocket,0)
00197 };
00198
00199 #endif