00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef __SOCKET_LAYER_H
00011 #define __SOCKET_LAYER_H
00012
00013 #include "RakMemoryOverride.h"
00014 #include "SocketIncludes.h"
00015 #include "RakNetTypes.h"
00016 #include "RakNetSmartPtr.h"
00017 #include "RakNetSocket.h"
00018 #include "Export.h"
00019 #include "MTUSize.h"
00020 #include "RakString.h"
00021
00022
00023
00024 class RakPeer;
00025
00026 class RAK_DLL_EXPORT SocketLayerOverride
00027 {
00028 public:
00029 SocketLayerOverride() {}
00030 virtual ~SocketLayerOverride() {}
00031
00033 virtual int RakNetSendTo( SOCKET s, const char *data, int length, SystemAddress systemAddress )=0;
00034
00036
00037 virtual int RakNetRecvFrom( const SOCKET sIn, RakPeer *rakPeerIn, char dataOut[ MAXIMUM_MTU_SIZE ], SystemAddress *senderOut, bool calledFromMainThread )=0;
00038 };
00039
00040
00041
00042 class SocketLayer
00043 {
00044
00045 public:
00046
00048 SocketLayer();
00049
00050
00051 ~SocketLayer();
00052
00053
00055 static inline SocketLayer* Instance()
00056 {
00057 return & I;
00058 }
00059
00060
00065 SOCKET Connect( SOCKET writeSocket, unsigned int binaryAddress, unsigned short port );
00066
00071 SOCKET CreateBoundSocket( unsigned short port, bool blockingSocket, const char *forceHostAddress, unsigned int sleepOn10048 );
00072 SOCKET CreateBoundSocket_PS3Lobby( unsigned short port, bool blockingSocket, const char *forceHostAddress );
00073
00077 static bool IsPortInUse(unsigned short port, const char *hostAddress=0);
00078
00079 const char* DomainNameToIP( const char *domainName );
00080
00084 bool AssociateSocketWithCompletionPortAndRead( SOCKET readSocket, unsigned int binaryAddress, unsigned short port, RakPeer* rakPeer );
00085
00090 void Write( const SOCKET writeSocket, const char* data, const int length );
00091
00098 int RecvFrom( const SOCKET s, RakPeer *rakPeer, int *errorCode, RakNetSmartPtr<RakNetSocket> rakNetSocket, unsigned short remotePortRakNetWasStartedOn_PS3 );
00099
00100 static void RecvFromBlocking( const SOCKET s, RakPeer *rakPeer, unsigned short remotePortRakNetWasStartedOn_PS3, char *dataOut, int *bytesReadOut, SystemAddress *systemAddressOut, RakNetTimeUS *timeRead );
00101
00109 void RawRecvFromNonBlocking( const SOCKET s, unsigned short remotePortRakNetWasStartedOn_PS3, char *dataOut, int *bytesReadOut, SystemAddress *systemAddressOut, RakNetTimeUS *timeRead );
00110
00111
00116 RakNet::RakString GetSubNetForSocketAndIp(SOCKET inSock, RakNet::RakString inIpString);
00117
00118
00121 void SetNonBlocking( SOCKET listenSocket);
00122
00123 #if !defined(_XBOX) && !defined(_X360)
00124
00125
00126
00127 void GetMyIP( char ipList[ MAXIMUM_NUMBER_OF_INTERNAL_IDS ][ 16 ], unsigned int binaryAddresses[MAXIMUM_NUMBER_OF_INTERNAL_IDS] );
00128 #endif
00129
00137 int SendTo( SOCKET s, const char *data, int length, const char ip[ 16 ], unsigned short port, unsigned short remotePortRakNetWasStartedOn_PS3 );
00138
00149 int SendToTTL( SOCKET s, const char *data, int length, const char ip[ 16 ], unsigned short port, int ttl );
00150
00158 int SendTo( SOCKET s, const char *data, int length, unsigned int binaryAddress, unsigned short port, unsigned short remotePortRakNetWasStartedOn_PS3 );
00159
00163 static unsigned short GetLocalPort ( SOCKET s );
00164
00165 static SystemAddress GetSystemAddress ( SOCKET s );
00166
00167 void SetSocketLayerOverride(SocketLayerOverride *_slo);
00168 SocketLayerOverride* GetSocketLayerOverride(void) const {return slo;}
00169
00170 int SendTo_PS3Lobby( SOCKET s, const char *data, int length, unsigned int binaryAddress, unsigned short port, unsigned short remotePortRakNetWasStartedOn_PS3 );
00171 int SendTo_360( SOCKET s, const char *data, int length, const char *voiceData, int voiceLength, unsigned int binaryAddress, unsigned short port );
00172 int SendTo_PC( SOCKET s, const char *data, int length, unsigned int binaryAddress, unsigned short port );
00173
00174
00175 static void SetDoNotFragment( SOCKET listenSocket, int opt );
00176 private:
00177
00178
00179 static SocketLayer I;
00180 void SetSocketOptions( SOCKET listenSocket);
00181 SocketLayerOverride *slo;
00182 };
00183
00184 #endif
00185