00001 #ifndef __UT_IPC__
00002 #define __UT_IPC__
00003
00004 #include "UT_API.h"
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <sys/types.h>
00017
00018 #ifdef WIN32
00019 #include <windows.h>
00020 struct sockaddr_un {
00021 short sun_family;
00022 char sun_path[108];
00023 };
00024 #else
00025 #include <sys/socket.h>
00026 #include <sys/un.h>
00027 #include <netinet/in.h>
00028 #include <arpa/inet.h>
00029 #endif
00030
00031 #include <iostream.h>
00032
00033 class UT_API UT_IPCPacket {
00034 public:
00035 UT_IPCPacket(char *msg, int len = 0);
00036 ~UT_IPCPacket();
00037
00038 int len;
00039 char *buf;
00040 };
00041
00042 typedef struct sockaddr *SOCKADDR_PTR;
00043 typedef struct iovec *IOVEC_PTR;
00044 typedef const struct sockaddr *CONST_SOCKADDR_PTR;
00045
00046
00047 class UT_API UT_InetAddress
00048 {
00049 friend class UT_InetSocket;
00050 friend ostream &operator<<(ostream &os, const UT_InetAddress &ia);
00051
00052 public:
00053 static const char *UT_Any;
00054 static const char *UT_Broadcast;
00055 enum UT_Status {
00056 UT_NoHostGiven,
00057 UT_UnknownHost,
00058 UT_UnKnownService,
00059 UT_HostFound
00060 };
00061
00062 UT_InetAddress();
00063 explicit UT_InetAddress(int port);
00064 UT_InetAddress(const char *service, const char *protocol);
00065 UT_InetAddress(const char *hostname, int port);
00066 UT_InetAddress(const char *hostname, const char *service, const char *proto);
00067
00068 const char * hostname() const;
00069 const char *numeric_hostname() const;
00070
00071 int port() const;
00072 int ok() const { return state==UT_HostFound; }
00073 UT_Status status() const { return state; }
00074 int size() const { return sizeof(address); }
00075 int isany() const { return any_flag; }
00076 int isbroadcast() const { return broadcast_flag; }
00077
00078 operator SOCKADDR_PTR() { return (SOCKADDR_PTR)&address; }
00079 operator CONST_SOCKADDR_PTR() const { return (CONST_SOCKADDR_PTR)&address; }
00080
00081 protected:
00082
00083 int lookup(const char *hostname, int port);
00084 int lookup(const char *hostname,
00085 const char *service,
00086 const char *proto);
00087
00088 int lookup(int aport) { return lookup(UT_Any,aport); }
00089 int lookup(const char *service, const char *protocol)
00090 { return lookup(UT_Any, service, protocol); }
00091
00092 struct sockaddr_in address;
00093 int addrlen;
00094 UT_Status state;
00095 int any_flag;
00096 int broadcast_flag;
00097 };
00098
00099
00100 class UT_API UT_UnixAddress
00101 {
00102 friend class UT_UnixSocket;
00103 friend ostream &operator<<(ostream &os, const UT_UnixAddress &ia);
00104 public:
00105 static char *Temp;
00106
00107 UT_UnixAddress();
00108 UT_UnixAddress(const char *pathname);
00109
00110 const char *pathname() const;
00111
00112 operator SOCKADDR_PTR() { return (SOCKADDR_PTR) &address; }
00113 operator CONST_SOCKADDR_PTR() const { return (CONST_SOCKADDR_PTR)&address;}
00114
00115 protected:
00116 void set(const char *pathname);
00117 int size() const { return sizeof(address); }
00118
00119 struct sockaddr_un address;
00120 int addrlen;
00121 };
00122
00123
00124
00125 class UT_API UT_Transport
00126 {
00127 public:
00128 UT_Transport();
00129 virtual ~UT_Transport();
00130
00131 virtual void abstract_class() = 0;
00132 virtual int close();
00133
00134 virtual int read( char *buffer, int len);
00135 virtual int write(const char *buffer, int len);
00136 virtual UT_IPCPacket *getPacket();
00137
00138 virtual int readv(const IOVEC_PTR, int);
00139 virtual int writev(const IOVEC_PTR, int);
00140
00141 virtual int ok();
00142 virtual int inuse();
00143
00144 const char *getError() const { return errorMsg; }
00145 int getDescriptor() const { return td; }
00146
00147 int return_on_error;
00148
00149 static void daemon_start(int ignore_sigcld);
00150
00151 protected:
00152 void setError(const char *module, const char *func,
00153 const char *mess);
00154 int readPartial(char *buffer, int len);
00155 int writePartial(char *buffer, int len);
00156
00157 enum UT_ShutDownType {
00158 UT_ShutDownReceive = 0,
00159 UT_ShutDownSend = 1,
00160 UT_ShutDownBoth = 2
00161 };
00162 virtual void shutdown(UT_ShutDownType) = 0;
00163
00164 int status;
00165 int td;
00166 char errorMsg[256];
00167 };
00168
00169
00170 class UT_API UT_Socket : public UT_Transport
00171 {
00172 void abstract_class();
00173
00174 public:
00175 enum UT_SocketSex {
00176 UT_Unknown,
00177 UT_Client,
00178 UT_Server
00179 };
00180 enum UT_AddressFamily {
00181 UT_AfUnix = AF_UNIX,
00182 UT_AfInet = AF_INET
00183 };
00184 enum UT_SocketType {
00185 UT_Stream = SOCK_STREAM,
00186 UT_Datagram = SOCK_DGRAM,
00187 UT_Raw = SOCK_RAW,
00188 UT_RDM = SOCK_RDM,
00189 UT_SeqPacket = SOCK_SEQPACKET
00190 };
00191
00192 enum UT_MsgSendFlags {
00193 UT_MsgSendNoFlags = 0,
00194 UT_MsgSendDontRoute = MSG_DONTROUTE,
00195 UT_MsgSendOob = MSG_OOB,
00196 UT_MsgSendDontRouteOob = MSG_OOB|MSG_DONTROUTE
00197 };
00198 enum UT_MsgReceiveFlags {
00199 UT_MsgReceiveNoFlags = 0,
00200 UT_MsgReceivePeek = MSG_PEEK,
00201 UT_MsgReceiveOob = MSG_OOB,
00202 UT_MsgReceivePeekOob = MSG_OOB|MSG_PEEK
00203 };
00204
00205 enum UT_FlagOption {
00206 UT_Off = 0,
00207 UT_On = 1
00208 };
00209 enum UT_SocketLevelOption {
00210 UT_Broadcast = SO_BROADCAST,
00211 UT_Debug = SO_DEBUG,
00212 UT_DontRoute = SO_DONTROUTE,
00213 UT_KeepAlive = SO_KEEPALIVE,
00214 UT_OOBInline = SO_OOBINLINE,
00215 UT_ReuseAddr = SO_REUSEADDR,
00216 #if !defined(LINUX) && !defined(MBSD)
00217 UT_UseLoopBack = SO_USELOOPBACK
00218 #endif
00219 };
00220 UT_Socket(UT_AddressFamily af, UT_SocketType st);
00221 ~UT_Socket();
00222
00223 UT_Socket(UT_AddressFamily af);
00224 UT_Socket(UT_SocketType st);
00225
00226 virtual int close();
00227
00228 int listen(int);
00229 int recv (char *, int, UT_MsgReceiveFlags = UT_MsgReceiveNoFlags);
00230 int recvfrom(char *, int, struct sockaddr *,
00231 int &, UT_MsgReceiveFlags = UT_MsgReceiveNoFlags);
00232
00233 int send (const char *, int, UT_MsgSendFlags = UT_MsgSendNoFlags);
00234 int sendto(const char *, int, const struct sockaddr *,
00235 int, UT_MsgSendFlags = UT_MsgSendNoFlags);
00236
00237 int recvmsg(struct msghdr *, UT_MsgReceiveFlags = UT_MsgReceiveNoFlags);
00238 int sendmsg(struct msghdr *, UT_MsgSendFlags = UT_MsgSendNoFlags);
00239
00240 void linger();
00241 int setOption(UT_SocketLevelOption slo, UT_FlagOption fo);
00242 int getOption(UT_SocketLevelOption slo, UT_FlagOption &fo);
00243
00244 UT_AddressFamily address_family() { return family; }
00245 UT_SocketType socket_type() { return type; }
00246 UT_SocketSex socket_sex() { return sex; }
00247 int socket_protocol() { return protocol; }
00248 int isclient() { return sex==UT_Client; }
00249 int isserver() { return sex==UT_Server; }
00250 virtual int socket();
00251
00252 protected:
00253 virtual void shutdown(UT_ShutDownType);
00254
00255 int accept(struct sockaddr *sa, int &len);
00256 int bind(const struct sockaddr *,int);
00257 int connect(const struct sockaddr *,int);
00258 int getpeername(struct sockaddr *, int &len);
00259 int getsockname(struct sockaddr *, int &len);
00260 int getsockopt(int, int, char *, int *);
00261 int setsockopt(int, int, const char *, int);
00262
00263 int check_syscall(int state, const char *mess);
00264 int syscall(int state, const char *mess);
00265
00266 UT_SocketType type;
00267 UT_AddressFamily family;
00268 int protocol;
00269 UT_SocketSex sex;
00270 };
00271
00272
00273
00274
00275 class UT_API UT_UnixSocket : public UT_Socket
00276 {
00277 public:
00278 UT_UnixSocket(UT_SocketType st);
00279 ~UT_UnixSocket();
00280
00281 int open(const UT_UnixAddress &ua, UT_SocketSex sex);
00282 int accept(UT_UnixSocket &newsocket);
00283 int close();
00284
00285 const UT_UnixAddress &local_address() { return local; }
00286 const UT_UnixAddress &remote_address() { return remote; }
00287
00288 private:
00289 UT_UnixAddress local;
00290 UT_UnixAddress remote;
00291 int unlink_socket;
00292 };
00293
00294
00295 class UT_API UT_InetSocket : public UT_Socket
00296 {
00297 public:
00298 UT_InetSocket();
00299 UT_InetSocket(UT_SocketType st);
00300 ~UT_InetSocket();
00301
00302 int accept(UT_InetSocket &newsocket);
00303 int bind(const UT_InetAddress &ia);
00304 int connect(const UT_InetAddress &ia);
00305 int getpeername(UT_InetAddress &ia);
00306 int getsockname(UT_InetAddress &ia);
00307
00308 int recvfrom(char *buffer, int max, UT_InetAddress &is);
00309 int sendto(char *buffer, int len, const UT_InetAddress &is);
00310 };
00311
00312
00313 class UT_API UT_UnixStream : public UT_UnixSocket
00314 {
00315 public:
00316 UT_UnixStream() : UT_UnixSocket(UT_Stream) {};
00317 ~UT_UnixStream();
00318
00319 int open(const char *path, UT_SocketSex asex)
00320 { return UT_UnixSocket::open(path,asex); }
00321 int accept(UT_UnixStream &newstream)
00322 { return UT_UnixSocket::accept(newstream); }
00323 int close();
00324 };
00325
00326
00327 class UT_API UT_InetStream :public UT_InetSocket
00328 {
00329 public:
00330 UT_InetStream();
00331 ~UT_InetStream();
00332
00333 int accept(UT_InetStream &newstream)
00334 { return UT_InetSocket::accept(newstream); }
00335
00336 int socketServer(const UT_InetAddress &ia, int minPort = -1,
00337 int maxPort = -1 );
00338 int socketClient(const UT_InetAddress &ia, int minPort = -1,
00339 int maxPort = -1 );
00340 void setNoDelay(int on_or_off);
00341 };
00342
00343
00344
00345 class UT_API UT_InetDatagram :public UT_InetSocket
00346 {
00347 public:
00348 UT_InetDatagram();
00349 ~UT_InetDatagram();
00350
00351 int accept(UT_InetDatagram &newstream);
00352
00353 int socketClient();
00354 int socketClient(const UT_InetAddress &ia);
00355 int socketServer(const UT_InetAddress &ia);
00356
00357 virtual int socket();
00358 };
00359
00360 #endif