00001 #ifndef __NET_LINK_H__
00002 #define __NET_LINK_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef WIN32
00016 #include <netinet/in.h>
00017 #include <sys/socket.h>
00018 #include <sys/types.h>
00019 #include <sys/uio.h>
00020 #include <fcntl.h>
00021 #else
00022 #include <Winsock2.h>
00023 #endif
00024
00025 #include "XrdNet/XrdNetBuffer.hh"
00026 #include "XrdNet/XrdNetDNS.hh"
00027 #include "XrdOuc/XrdOucChain.hh"
00028 #include "XrdSys/XrdSysPthread.hh"
00029
00030
00031
00032 #define XRDNETLINK_NOBLOCK 0x0001
00033 #define XRDNETLINK_NOCLOSE 0x0002
00034 #define XRDNETLINK_NOSTREAM 0x0004
00035
00036
00037
00038 class XrdNet;
00039 class XrdNetPeer;
00040 class XrdSysError;
00041 class XrdOucStream;
00042 class XrdOucTokenizer;
00043
00044 class XrdNetLink
00045 {
00046 public:
00047
00048 XrdOucQSItem<XrdNetLink> LinkLink;
00049
00050 static XrdNetLink *Alloc(XrdSysError *erp, XrdNet *Net, XrdNetPeer &Peer,
00051 XrdNetBufferQ *bq, int opts=0);
00052
00053
00054
00055
00056
00057 int Close(int defer=0);
00058
00059
00060
00061 int FDnum() {return FD;}
00062
00063
00064
00065
00066 char *GetLine();
00067
00068 char *GetToken(char **rest);
00069 char *GetToken(void);
00070 void RetToken(void);
00071
00072
00073
00074
00075 int isConnected(void) {return (Stream != 0) && (FD >= 0);}
00076
00077
00078
00079 int LastError();
00080
00081
00082
00083 unsigned int Addr() {return XrdNetDNS::IPAddr(&InetAddr);}
00084
00085
00086
00087 const char *Moniker() {return Sname;}
00088
00089
00090
00091 const char *Name() {return Lname;}
00092
00093
00094
00095 const char *Nick() {return Sname;}
00096
00097
00098
00099 int OK2Recv(int mills);
00100
00101
00102
00103 void Recycle();
00104
00105
00106
00107
00108
00109 int Send(const char *buff,
00110 int blen=0,
00111 int tmo=-1);
00112
00113 int Send(const char *dest,
00114 const char *buff,
00115 int blen=0,
00116 int tmo=-1);
00117
00118 int Send(const struct iovec iov[],
00119 int iovcnt,
00120 int tmo = -1);
00121
00122 int Send(const char *dest,
00123 const struct iovec iov[],
00124 int iovcnt,
00125 int tmo=-1);
00126
00127
00128
00129
00130 int Send(const void *buff,
00131 int blen=0,
00132 int tmo=-1);
00133
00134
00135
00136
00137
00138 int Recv(char *buff, int blen);
00139
00140
00141
00142
00143 void Set(int maxl);
00144
00145
00146
00147 void SetOpts(int opts);
00148
00149
00150
00151
00152
00153 XrdNetLink(XrdSysError *erp, XrdNetBufferQ *bq) : LinkLink(this)
00154 {FD = -1; Lname = Sname = 0; recvbuff = sendbuff = 0;
00155 BuffQ = bq; Stream = 0; Bucket = 0; eDest = erp;
00156 }
00157 ~XrdNetLink() {Close();}
00158
00159 private:
00160
00161 int OK2Send(int timeout=0, const char *dest=0);
00162 int retErr(int ecode, const char *dest=0);
00163
00164 XrdSysMutex rdMutex;
00165 XrdSysMutex wrMutex;
00166 XrdNetBufferQ *BuffQ;
00167 int FD;
00168 int noclose;
00169 int isReset;
00170 struct sockaddr InetAddr;
00171 char *Lname;
00172 char *Sname;
00173 XrdNetBuffer *recvbuff;
00174 XrdNetBuffer *sendbuff;
00175 XrdOucStream *Stream;
00176 XrdOucTokenizer *Bucket;
00177 XrdSysError *eDest;
00178
00179 static XrdSysMutex LinkList;
00180 static XrdOucStack<XrdNetLink> LinkStack;
00181 static int size;
00182 static int maxlink;
00183 static int numlink;
00184 static int devNull;
00185 };
00186 #endif