XPSocket.h

00001 /* START_LICENSE_HEADER
00002 
00003 Copyright (C) 2000 Martin Piper, original design and program code
00004 Copyright (C) 2001 Replica Software
00005 
00006 This program file is copyright (C) Replica Software and can only be used under license.
00007 For more information visit: http://www.replicanet.com/
00008 Or email: info@replicanet.com
00009 
00010 END_LICENSE_HEADER */
00011 /* XPSocket.h */
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 /* Some error return defines */
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 /* Probable XPSocket types */
00053 #define XPSOCK_TLOCALHOST   (0)
00054 #define XPSOCK_TINET        (1)
00055 
00056 /* XPSocket status */
00057 #define XPSOCK_SNULL        (0)
00058 #define XPSOCK_SLISTEN      (1)
00059 #define XPSOCK_SCONNECT     (2)
00060 #define XPSOCK_SCLOSE       (3)
00061 
00062 /* Flags to pass to XPSock_Recv */
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 /* Some constants for the local loop back sockets */
00075 #define XPSOCK_LOOPBACKBUFFER   20480
00076 
00077 /* Flags returned by XPSock_GetHardwareStatus */
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 /* Structs and their type defs */
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 // Useful operators to compare addresses
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 // Can be used with STL less<> tests
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 /* Macros to make life easier */
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 } // namespace RNXPSockets
00246 
00247 // Return error values are either pXPSOCK_EERROR, XPSOCK_EERROR or pXPSOCK_EOK
00248 
00249 /* All the global functions */
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 * /*socket*/,int /*size*/);
00254 extern int XPSock_SetRecvBuffer(RNReplicaNet::t_XPSocket * /*socket*/,int /*size*/);
00255 extern int XPSock_Connect(RNReplicaNet::t_XPSocket * /*socket*/,const RNReplicaNet::t_XPAddress * /*addr*/);
00256 extern int XPSock_Send(RNReplicaNet::t_XPSocket * /*socket*/,const char * /*data*/,const int /*len*/);
00257 extern int XPSock_Recv(RNReplicaNet::t_XPSocket * /*socket*/,char * /*data*/,int /*maxlen*/,int /*flag*/);
00258 extern int XPSock_Close(RNReplicaNet::t_XPSocket * /*socket*/);
00259 extern int XPSock_Listen(RNReplicaNet::t_XPSocket * /*socket*/,int /*port*/);
00260 extern int XPSock_Listen(RNReplicaNet::t_XPSocket * /*socket*/,const RNReplicaNet::t_XPAddress * /*addr*/);
00261 extern RNReplicaNet::t_XPSocket *XPSock_Accept(RNReplicaNet::t_XPSocket * /*socket*/);
00262 
00263 extern int XPSock_GetAddress(RNReplicaNet::t_XPSocket * /*socket*/,RNReplicaNet::t_XPAddress * /*addr*/);
00264 extern int XPSock_GetPeerAddress(RNReplicaNet::t_XPSocket * /*socket*/,RNReplicaNet::t_XPAddress * /*addr*/);
00265 
00266 extern RNReplicaNet::t_XPSocket *XPSock_UrgentCreate(int /*port*/);
00267 extern RNReplicaNet::t_XPSocket *XPSock_UrgentCreate(const RNReplicaNet::t_XPAddress * /*addr*/);
00268 extern int XPSock_UrgentMakeBroadcast(RNReplicaNet::t_XPSocket * /*socket*/);
00269 extern int XPSock_UrgentSend(RNReplicaNet::t_XPSocket * /*socket*/,const char * /*data*/,int /*len*/,const RNReplicaNet::t_XPAddress * /*addr*/);
00270 extern int XPSock_UrgentRecv(RNReplicaNet::t_XPSocket * /*socket*/,char *const /*data*/,int /*maxlen*/,int /*flag*/,RNReplicaNet::t_XPAddress *const /*addr*/);
00271 
00272 extern RNReplicaNet::t_XPSocket *XPSock_ICMPCreate(void);
00273 extern int XPSock_ICMPSendPing(RNReplicaNet::t_XPSocket * /*socket*/,const RNReplicaNet::t_XPAddress * /*addr*/,unsigned short *retID,unsigned short *retSeq,unsigned int *retTimeSent);
00274 extern int XPSock_ICMPRecvPing(RNReplicaNet::t_XPSocket * /*socket*/,RNReplicaNet::t_XPAddress *const /*addr*/,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 /*errno*/);
00279 extern char *XPSock_TranslateErrorLong(int /*errno*/);
00280 
00281 extern int XPSock_GetHostName(char * /*name*/,int /*name_len*/);
00282 extern int XPSock_GetHostAddress(RNReplicaNet::XPAddress * /*addr*/);
00283 extern int XPSock_Resolve(RNReplicaNet::t_XPAddress * /*resolve*/,const char * /*input*/);
00284 
00285 extern int XPSock_UtilityGetFragment(char * /*buffer*/,int /*maxlen*/);
00286 extern int XPSock_UtilityGetInt(char * /*buffer*/,int /*offset*/);
00287 extern void XPSock_UtilitySetInt(char * /*buffer*/,int /*offset*/,int /*value*/);
00288 extern short XPSock_UtilityGetShort(char * /*buffer*/,int /*offset*/);
00289 extern void XPSock_UtilitySetShort(char * /*buffer*/,int /*offset*/,short /*value*/);
00290 
00291 extern int XPSock_UtilityChecksum(char * /*buffer*/,int /*length*/);
00292 
00293 extern void XPSock_Poll(void);
00294 
00295 extern void XPSock_SentHistogram(unsigned int * /*classes*/,int /*numClasses*/);
00296 extern void XPSock_RecvHistogram(unsigned int * /*classes*/,int /*numClasses*/);
00297 
00298 extern int XPSock_GetHardwareStatus(void);
00299 
00300 // The global variables
00301 extern int asocket_lasterror;                       
00303 /* Extern the counters */
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 // Only use these if you know exactly what you are doing
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 

Generated on Sat Jun 28 22:02:16 2008 for ReplicaNet and RNLobby by  doxygen 1.5.3