00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00043 #ifndef CCXX_SOCKET_H_
00044 #define CCXX_SOCKET_H_
00045
00046 #ifndef CCXX_ADDRESS_H_
00047 #include <cc++/address.h>
00048 #endif
00049
00050 #if defined(WIN32) && !defined(__CYGWIN32__)
00051 #include <io.h>
00052 #define _IOLEN64 (unsigned)
00053 #define _IORET64 (int)
00054 #define TIMEOUT_INF ~((timeout_t) 0)
00055 typedef int socklen_t;
00056 #else
00057 #define INVALID_SOCKET -1
00058 typedef int SOCKET;
00059 #endif
00060
00061 #ifndef _IOLEN64
00062 #define _IOLEN64
00063 #endif
00064
00065 #ifndef _IORET64
00066 #define _IORET64
00067 #endif
00068
00069 #ifndef MSG_DONTWAIT
00070 #define MSG_DONTWAIT 0
00071 #endif
00072
00073 #ifndef MSG_NOSIGNAL
00074 #define MSG_NOSIGNAL 0
00075 #endif
00076
00077 #ifdef CCXX_NAMESPACES
00078 namespace ost {
00079 #endif
00080
00084 typedef unsigned short tpport_t;
00085
00103 class __EXPORT Socket
00104 {
00105 public:
00106 enum Family {
00107 #ifdef CCXX_IPV6
00108 IPV6 = AF_INET6,
00109 #endif
00110 IPV4 = AF_INET
00111 };
00112
00113 typedef enum Family Family;
00114
00115 enum Error {
00116 errSuccess = 0,
00117 errCreateFailed,
00118 errCopyFailed,
00119 errInput,
00120 errInputInterrupt,
00121 errResourceFailure,
00122 errOutput,
00123 errOutputInterrupt,
00124 errNotConnected,
00125 errConnectRefused,
00126 errConnectRejected,
00127 errConnectTimeout,
00128 errConnectFailed,
00129 errConnectInvalid,
00130 errConnectBusy,
00131 errConnectNoRoute,
00132 errBindingFailed,
00133 errBroadcastDenied,
00134 errRoutingDenied,
00135 errKeepaliveDenied,
00136 errServiceDenied,
00137 errServiceUnavailable,
00138 errMulticastDisabled,
00139 errTimeout,
00140 errNoDelay,
00141 errExtended,
00142 errLookupFail,
00143 errSearchErr,
00144 errInvalidValue
00145 };
00146
00147 typedef enum Error Error;
00148
00149 enum Tos {
00150 tosLowDelay = 0,
00151 tosThroughput,
00152 tosReliability,
00153 tosMinCost,
00154 tosInvalid
00155 };
00156 typedef enum Tos Tos;
00157
00158 enum Pending {
00159 pendingInput,
00160 pendingOutput,
00161 pendingError
00162 };
00163 typedef enum Pending Pending;
00164
00165 protected:
00166 enum State {
00167 INITIAL,
00168 AVAILABLE,
00169 BOUND,
00170 CONNECTED,
00171 CONNECTING,
00172 STREAM
00173 };
00174 typedef enum State State;
00175
00176 private:
00177
00178 mutable Error errid;
00179 mutable const char *errstr;
00180 mutable long syserr;
00181
00182 void setSocket(void);
00183 friend SOCKET dupSocket(SOCKET s,Socket::State state);
00184
00185 protected:
00186 static Mutex mutex;
00187
00188 mutable struct {
00189 bool thrown: 1;
00190 bool broadcast: 1;
00191 bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;
bool route: 1;