00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef _XPSOCK_H_
00013 #define _XPSOCK_H_
00014 #include "RNPlatform/Inc/DLLExportAPI.h"
00015
00016 #include <string>
00017 #include "RNPlatform/Inc/MessageHelper.h"
00018
00019 namespace RNReplicaNet
00020 {
00021
00022 #define _XPSOCK_VERSION 1500
00023
00024
00025
00029 #define XPSOCK_EOK (0)
00030 #define XPSOCK_EERROR (-1)
00031 #define XPSOCK_EWOULDBLOCK (-2)
00032 #define XPSOCK_ECLOSED (-3)
00033 #define XPSOCK_ENOEXIST (-4)
00034 #define XPSOCK_ENOMEMORY (-5)
00035 #define XPSOCK_ENOTASOCKET (-6)
00036 #define XPSOCK_ECANTLISTEN (-7)
00037 #define XPSOCK_ENOTALISTEN (-8)
00038 #define XPSOCK_ENOTCONNECTED (-9)
00039 #define XPSOCK_EBUFFEROVERFLOW (-10)
00040 #define XPSOCK_EUDPSENDFAILED (-11)
00041 #define XPSOCK_ECANTBIND (-12)
00042 #define XPSOCK_ECANTRESOLVE (-13)
00043 #define XPSOCK_EURGENTTOOBIG (-14)
00044 #define XPSOCK_BUFFERTOOSMALL (-15)
00045 #define XPSOCK_ILLEGALOPERATION (-16)
00046 #define XPSOCK_ECONNINPROGRESS (-17)
00047 #define XPSOCK_ESTACKSTARTFAILURE (-18)
00048 #define XPSOCK_ESTACKNOTSTARTED (-19)
00050 #define pXPSOCK_EERROR ((t_XPSocket *) XPSOCK_EERROR)
00052
00053 #define XPSOCK_TLOCALHOST (0)
00054 #define XPSOCK_TINET (1)
00055
00056
00057 #define XPSOCK_SNULL (0)
00058 #define XPSOCK_SLISTEN (1)
00059 #define XPSOCK_SCONNECT (2)
00060 #define XPSOCK_SCLOSE (3)
00061
00062
00063 #define XPSOCK_FNULL (0)
00064 #define XPSOCK_FPEEK (1)
00067 #define XPSOCK_PORT_ANY (0)
00068 #define XPSOCK_PORT_LOCAL (-1)
00070 #define XPSOCK_MAXPACKETSIZE (8192)
00072 #define XPSOCK_URGENTMAXPACKETSIZE (2048)
00074
00075 #define XPSOCK_LOOPBACKBUFFER 20480
00076
00077
00078 #define XPSOCK_HARDWARE_AVAILABLE (1<<0)
00079 #define XPSOCK_HARDWARE_CABLE_CONNECTED (1<<1)
00080 #define XPSOCK_HARDWARE_10MBS (1<<2)
00081 #define XPSOCK_HARDWARE_100MBS (1<<3)
00082 #define XPSOCK_HARDWARE_FULL_DUPLEX (1<<4)
00083 #define XPSOCK_HARDWARE_HALF_DUPLEX (1<<5)
00084
00085
00086
00087
00091 struct XPAddress
00092 {
00096 XPAddress(const int port,unsigned char addr1,unsigned char addr2,unsigned char addr3,unsigned char addr4);
00097
00101 XPAddress(const int port);
00102
00106 XPAddress(std::string addr);
00107
00111 XPAddress();
00112
00117 std::string Export(void) const;
00118
00124 bool Import(const std::string address);
00125
00129 void MakeAny(const int port = XPSOCK_PORT_ANY);
00130
00134 static XPAddress Null(void);
00135
00136 int port;
00137 unsigned char addr[4];
00138 };
00139 typedef struct XPAddress t_XPAddress;
00140 typedef struct XPAddress XPAddress;
00141
00142
00143 inline bool operator== (const t_XPAddress& a,const t_XPAddress& b)
00144 {
00145 return (a.addr[0] == b.addr[0]) && (a.addr[1] == b.addr[1]) && (a.addr[2] == b.addr[2]) && (a.addr[3] == b.addr[3]) && (a.port == b.port);
00146 }
00147
00148 inline bool operator!= (const t_XPAddress& a,const t_XPAddress& b)
00149 {
00150 return !(a == b);
00151 }
00152
00153
00154 inline bool operator< (const t_XPAddress& a,const t_XPAddress& b)
00155 {
00156 if (a.addr[0] < b.addr[0])
00157 {
00158 return true;
00159 }
00160 else if(a.addr[0] == b.addr[0])
00161 {
00162 if (a.addr[1] < b.addr[1])
00163 {
00164 return true;
00165 }
00166 else if (a.addr[1] == b.addr[1])
00167 {
00168 if (a.addr[2] < b.addr[2])
00169 {
00170 return true;
00171 }
00172 else if (a.addr[2] == b.addr[2])
00173 {
00174 if (a.addr[3] < b.addr[3])
00175 {
00176 return true;
00177 }
00178 else if (a.addr[3] == b.addr[3])
00179 {
00180 return (a.port < b.port);
00181 }
00182 }
00183 }
00184 }
00185 return false;
00186 }
00187
00188 inline void operator<< (RNReplicaNet::DynamicMessageHelper &message,const XPAddress &a)
00189 {
00190 message << a.addr[0];
00191 message << a.addr[1];
00192 message << a.addr[2];
00193 message << a.addr[3];
00194 message << a.port;
00195 }
00196 inline void operator>> (RNReplicaNet::DynamicMessageHelper &message,XPAddress &a)
00197 {
00198 message >> a.addr[0];
00199 message >> a.addr[1];
00200 message >> a.addr[2];
00201 message >> a.addr[3];
00202 message >> a.port;
00203 }
00204
00205 typedef struct s_XPSocket t_XPSocket;
00206
00207 typedef struct s_XPSocket {
00208 int type;
00209 int state;
00210 int total_sent;
00211 int total_received;
00212 int total_accepts;
00213 int total_connects;
00214 int urgent;
00215 t_XPAddress addr;
00216 int wins_socket;
00217 t_XPSocket *loopback_socket;
00218 char *loopback_recvbuffer;
00219 int loopback_recvpos;
00220 int loopback_readpos;
00221 int loopback_pending;
00222 int port;
00223 } t_XPSocket;
00225 typedef struct s_XPErrorTranslate {
00226 int error;
00227 char *text;
00228 char *longtext;
00229 } t_XPErrorTranslate;
00231
00232 #define XPSOCK_PARANOID(x) if ((x) == NULL || (x) == pXPSOCK_EERROR)\
00233 {\
00234 asocket_lasterror = XPSOCK_ENOTASOCKET;\
00235 return XPSOCK_EERROR;\
00236 }
00237
00238
00239 #define XPSOCK_S_PARANOID(x) if ((x) == NULL || (x) == pXPSOCK_EERROR)\
00240 {\
00241 asocket_lasterror = XPSOCK_ENOTASOCKET;\
00242 return (t_XPSocket *) XPSOCK_EERROR;\
00243 }
00244
00245 }
00246
00247
00248
00249
00250 extern int XPSock_Init(void);
00251 extern int XPSock_Quit(void);
00252 extern RNReplicaNet::t_XPSocket *XPSock_Create(void);
00253 extern int XPSock_SetSendBuffer(RNReplicaNet::t_XPSocket * ,int );
00254 extern int XPSock_SetRecvBuffer(RNReplicaNet::t_XPSocket * ,int );
00255 extern int XPSock_Connect(RNReplicaNet::t_XPSocket * ,const RNReplicaNet::t_XPAddress * );
00256 extern int XPSock_Send(RNReplicaNet::t_XPSocket * ,const char * ,const int );
00257 extern int XPSock_Recv(RNReplicaNet::t_XPSocket * ,char * ,int ,int );
00258 extern int XPSock_Close(RNReplicaNet::t_XPSocket * );
00259 extern int XPSock_Listen(RNReplicaNet::t_XPSocket * ,int );
00260 extern int XPSock_Listen(RNReplicaNet::t_XPSocket * ,const RNReplicaNet::t_XPAddress * );
00261 extern RNReplicaNet::t_XPSocket *XPSock_Accept(RNReplicaNet::t_XPSocket * );
00262
00263 extern int XPSock_GetAddress(RNReplicaNet::t_XPSocket * ,RNReplicaNet::t_XPAddress * );
00264 extern int XPSock_GetPeerAddress(RNReplicaNet::t_XPSocket * ,RNReplicaNet::t_XPAddress * );
00265
00266 extern RNReplicaNet::t_XPSocket *XPSock_UrgentCreate(int );
00267 extern RNReplicaNet::t_XPSocket *XPSock_UrgentCreate(const RNReplicaNet::t_XPAddress * );
00268 extern int XPSock_UrgentMakeBroadcast(RNReplicaNet::t_XPSocket * );
00269 extern int XPSock_UrgentSend(RNReplicaNet::t_XPSocket * ,const char * ,int ,const RNReplicaNet::t_XPAddress * );
00270 extern int XPSock_UrgentRecv(RNReplicaNet::t_XPSocket * ,char *const ,int ,int ,RNReplicaNet::t_XPAddress *const );
00271
00272 extern RNReplicaNet::t_XPSocket *XPSock_ICMPCreate(void);
00273 extern int XPSock_ICMPSendPing(RNReplicaNet::t_XPSocket * ,const RNReplicaNet::t_XPAddress * ,unsigned short *retID,unsigned short *retSeq,unsigned int *retTimeSent);
00274 extern int XPSock_ICMPRecvPing(RNReplicaNet::t_XPSocket * ,RNReplicaNet::t_XPAddress *const ,unsigned short *retID,unsigned short *retSeq,unsigned int *retTimeElapsed);
00275 extern int XPSock_ICMPWaitForPing(RNReplicaNet::t_XPSocket * socket,const float timeoutSeconds = 1.0f);
00276
00277
00278 extern char *XPSock_TranslateError(int );
00279 extern char *XPSock_TranslateErrorLong(int );
00280
00281 extern int XPSock_GetHostName(char * ,int );
00282 extern int XPSock_GetHostAddress(RNReplicaNet::XPAddress * );
00283 extern int XPSock_Resolve(RNReplicaNet::t_XPAddress * ,const char * );
00284
00285 extern int XPSock_UtilityGetFragment(char * ,int );
00286 extern int XPSock_UtilityGetInt(char * ,int );
00287 extern void XPSock_UtilitySetInt(char * ,int ,int );
00288 extern short XPSock_UtilityGetShort(char * ,int );
00289 extern void XPSock_UtilitySetShort(char * ,int ,short );
00290
00291 extern int XPSock_UtilityChecksum(char * ,int );
00292
00293 extern void XPSock_Poll(void);
00294
00295 extern void XPSock_SentHistogram(unsigned int * ,int );
00296 extern void XPSock_RecvHistogram(unsigned int * ,int );
00297
00298 extern int XPSock_GetHardwareStatus(void);
00299
00300
00301 extern int asocket_lasterror;
00303
00304 extern int asocket_packets_got;
00305 extern int asocket_packets_sent;
00306 extern int asocket_packets_got_size;
00307 extern int asocket_packets_sent_size;
00309
00310 extern bool gXPSock_PacketLossEmulation;
00311 extern float gXPSock_PacketLossEmulationPercent;
00312 extern bool gXPSock_PacketLatencyEmulation;
00313 extern float gXPSock_PacketLatencyEmulationBase;
00314 extern float gXPSock_PacketLatencyEmulationJitter;
00315 extern int gXPSock_UDPProtoParameter;
00316
00317 #endif
00318