NatTypeDetectionCommon.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /*
  2. * Copyright (c) 2014, Oculus VR, Inc.
  3. * All rights reserved.
  4. *
  5. * This source code is licensed under the BSD-style license found in the
  6. * LICENSE file in the root directory of this source tree. An additional grant
  7. * of patent rights can be found in the PATENTS file in the same directory.
  8. *
  9. */
  10. #include "NatTypeDetectionCommon.h"
  11. #if _RAKNET_SUPPORT_NatTypeDetectionServer==1 || _RAKNET_SUPPORT_NatTypeDetectionClient==1
  12. #include "SocketLayer.h"
  13. #include "SocketIncludes.h"
  14. #include "SocketDefines.h"
  15. using namespace RakNet;
  16. bool RakNet::CanConnect(NATTypeDetectionResult type1, NATTypeDetectionResult type2)
  17. {
  18. /// If one system is NAT_TYPE_SYMMETRIC, the other must be NAT_TYPE_ADDRESS_RESTRICTED or less
  19. /// If one system is NAT_TYPE_PORT_RESTRICTED, the other must be NAT_TYPE_PORT_RESTRICTED or less
  20. bool connectionGraph[NAT_TYPE_COUNT][NAT_TYPE_COUNT] =
  21. {
  22. // None, Full Cone, Address Restricted, Port Restricted, Symmetric, Unknown, InProgress, Supports_UPNP
  23. {true, true, true, true, true, false, false, true}, // None
  24. {true, true, true, true, true, false, false, true}, // Full Cone
  25. {true, true, true, true, true, false, false, true}, // Address restricted
  26. {true, true, true, true, false, false, false, true}, // Port restricted
  27. {true, true, true, false, false, false, false, true}, // Symmetric
  28. {false, false, false, false, false, false, false, false}, // Unknown
  29. {false, false, false, false, false, false, false, false}, // InProgress
  30. {true, true, true, true, true, false, false, true} // Supports_UPNP
  31. };
  32. return connectionGraph[(int) type1][(int) type2];
  33. }
  34. const char *RakNet::NATTypeDetectionResultToString(NATTypeDetectionResult type)
  35. {
  36. switch (type)
  37. {
  38. case NAT_TYPE_NONE:
  39. return "None";
  40. case NAT_TYPE_FULL_CONE:
  41. return "Full cone";
  42. case NAT_TYPE_ADDRESS_RESTRICTED:
  43. return "Address restricted";
  44. case NAT_TYPE_PORT_RESTRICTED:
  45. return "Port restricted";
  46. case NAT_TYPE_SYMMETRIC:
  47. return "Symmetric";
  48. case NAT_TYPE_UNKNOWN:
  49. return "Unknown";
  50. case NAT_TYPE_DETECTION_IN_PROGRESS:
  51. return "In Progress";
  52. case NAT_TYPE_SUPPORTS_UPNP:
  53. return "Supports UPNP";
  54. case NAT_TYPE_COUNT:
  55. return "NAT_TYPE_COUNT";
  56. }
  57. return "Error, unknown enum in NATTypeDetectionResult";
  58. }
  59. // None and relaxed can connect to anything
  60. // Moderate can connect to moderate or less
  61. // Strict can connect to relaxed or less
  62. const char *RakNet::NATTypeDetectionResultToStringFriendly(NATTypeDetectionResult type)
  63. {
  64. switch (type)
  65. {
  66. case NAT_TYPE_NONE:
  67. return "Open";
  68. case NAT_TYPE_FULL_CONE:
  69. return "Relaxed";
  70. case NAT_TYPE_ADDRESS_RESTRICTED:
  71. return "Relaxed";
  72. case NAT_TYPE_PORT_RESTRICTED:
  73. return "Moderate";
  74. case NAT_TYPE_SYMMETRIC:
  75. return "Strict";
  76. case NAT_TYPE_UNKNOWN:
  77. return "Unknown";
  78. case NAT_TYPE_DETECTION_IN_PROGRESS:
  79. return "In Progress";
  80. case NAT_TYPE_SUPPORTS_UPNP:
  81. return "Supports UPNP";
  82. case NAT_TYPE_COUNT:
  83. return "NAT_TYPE_COUNT";
  84. }
  85. return "Error, unknown enum in NATTypeDetectionResult";
  86. }
  87. RakNetSocket2* RakNet::CreateNonblockingBoundSocket(const char *bindAddr
  88. #ifdef __native_client__
  89. ,_PP_Instance_ chromeInstance
  90. #endif
  91. , RNS2EventHandler *eventHandler
  92. )
  93. {
  94. RakNetSocket2 *r2 = RakNetSocket2Allocator::AllocRNS2();
  95. #if defined(__native_client__)
  96. NativeClientBindParameters ncbp;
  97. RNS2_NativeClient * nativeClientSocket = (RNS2_NativeClient*) r2;
  98. ncbp.eventHandler=eventHandler;
  99. ncbp.forceHostAddress=(char*) bindAddr;
  100. ncbp.is_ipv6=false;
  101. ncbp.nativeClientInstance=chromeInstance;
  102. ncbp.port=0;
  103. nativeClientSocket->Bind(&ncbp, _FILE_AND_LINE_);
  104. #elif defined(WINDOWS_STORE_RT)
  105. RakAssert("TODO" && 0);
  106. #else
  107. if (r2->IsBerkleySocket())
  108. {
  109. RNS2_BerkleyBindParameters bbp;
  110. bbp.port=0;
  111. bbp.hostAddress=(char*)bindAddr;
  112. bbp.addressFamily=AF_INET;
  113. bbp.type=SOCK_DGRAM;
  114. bbp.protocol=0;
  115. bbp.nonBlockingSocket=true;
  116. bbp.setBroadcast=true;
  117. bbp.setIPHdrIncl=false;
  118. bbp.doNotFragment=false;
  119. bbp.pollingThreadPriority=0;
  120. bbp.eventHandler=eventHandler;
  121. bbp.remotePortRakNetWasStartedOn_PS3_PS4_PSP2=0;
  122. RNS2BindResult br = ((RNS2_Berkley*) r2)->Bind(&bbp, _FILE_AND_LINE_);
  123. if (br==BR_FAILED_TO_BIND_SOCKET)
  124. {
  125. RakNetSocket2Allocator::DeallocRNS2(r2);
  126. return 0;
  127. }
  128. else if (br==BR_FAILED_SEND_TEST)
  129. {
  130. RakNetSocket2Allocator::DeallocRNS2(r2);
  131. return 0;
  132. }
  133. else
  134. {
  135. RakAssert(br==BR_SUCCESS);
  136. }
  137. ((RNS2_Berkley*) r2)->CreateRecvPollingThread(0);
  138. }
  139. else
  140. {
  141. RakAssert("TODO" && 0);
  142. }
  143. #endif
  144. return r2;
  145. /*
  146. #ifdef __native_client__
  147. RakNetSocket2 *s = SocketLayer::CreateBoundSocket( 0, 0, false, bindAddr, true, 0, AF_INET, chromeInstance );
  148. #else
  149. RakNetSocket2 *s = SocketLayer::CreateBoundSocket( 0, 0, false, bindAddr, true, 0, AF_INET, 0 );
  150. #endif
  151. #ifdef _WIN32
  152. unsigned long nonblocking = 1;
  153. s->IOCTLSocket( FIONBIO, &nonblocking );
  154. #elif defined(_PS3) || defined(__PS3__) || defined(SN_TARGET_PS3) || defined(_PS4) || defined(SN_TARGET_PSP2)
  155. int sock_opt=1;
  156. s->SetSockOpt(SOL_SOCKET, SO_NBIO, ( char * ) & sock_opt, sizeof ( sock_opt ) );
  157. #elif defined(__native_client__)
  158. // Nop
  159. #else
  160. s->Fcntl( F_SETFL, O_NONBLOCK );
  161. #endif
  162. return s;
  163. */
  164. }
  165. /*
  166. int RakNet::NatTypeRecvFrom(char *data, RakNetSocket2* socket, SystemAddress &sender, RNS2EventHandler *eventHandler)
  167. {
  168. #if defined(__native_client__)
  169. RakAssert("TODO" && 0);
  170. #elif defined(WINDOWS_STORE_RT)
  171. RakAssert("TODO" && 0);
  172. #else
  173. if (socket->IsBerkleySocket())
  174. {
  175. RNS2RecvStruct *recvFromStruct;
  176. recvFromStruct=AllocRNS2RecvStruct(_FILE_AND_LINE_);
  177. if (recvFromStruct != NULL)
  178. {
  179. recvFromStruct->socket=this;
  180. socket->RecvFromBlocking(recvFromStruct);
  181. }
  182. if (recvFromStruct->bytesRead>0)
  183. {
  184. sender = recvFromStruct->systemAddress;
  185. }
  186. return recvFromStruct->bytesRead;
  187. }
  188. return 0;
  189. #endif
  190. }
  191. */
  192. #endif // #if _RAKNET_SUPPORT_NatTypeDetectionServer==1 || _RAKNET_SUPPORT_NatTypeDetectionClient==1
粤ICP备19079148号