RakNetTypes.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  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. /// \file
  11. ///
  12. #include "RakNetTypes.h"
  13. #include "RakAssert.h"
  14. #include <string.h>
  15. #include <stdio.h>
  16. #include "WindowsIncludes.h"
  17. #include "WSAStartupSingleton.h"
  18. #include "SocketDefines.h"
  19. #include "RakNetSocket2.h"
  20. #if defined(_WIN32)
  21. // extern __int64 _strtoui64(const char*, char**, int); // needed for Code::Blocks. Does not compile on Visual Studio 2010
  22. // IP_DONTFRAGMENT is different between winsock 1 and winsock 2. Therefore, Winsock2.h must be linked againt Ws2_32.lib
  23. // winsock.h must be linked against WSock32.lib. If these two are mixed up the flag won't work correctly
  24. #include "WindowsIncludes.h"
  25. #else
  26. #include <sys/socket.h>
  27. #include <netinet/in.h>
  28. #include <arpa/inet.h>
  29. #endif
  30. #include <string.h> // strncasecmp
  31. #include "Itoa.h"
  32. #include "SocketLayer.h"
  33. #include "SuperFastHash.h"
  34. #include <stdlib.h>
  35. using namespace RakNet;
  36. const char *IPV6_LOOPBACK="::1";
  37. const char *IPV4_LOOPBACK="127.0.0.1";
  38. AddressOrGUID::AddressOrGUID( Packet *packet )
  39. {
  40. rakNetGuid=packet->guid;
  41. systemAddress=packet->systemAddress;
  42. }
  43. unsigned long AddressOrGUID::ToInteger( const AddressOrGUID &aog )
  44. {
  45. if (aog.rakNetGuid!=UNASSIGNED_RAKNET_GUID)
  46. return RakNetGUID::ToUint32(aog.rakNetGuid);
  47. return SystemAddress::ToInteger(aog.systemAddress);
  48. }
  49. const char *AddressOrGUID::ToString(bool writePort) const
  50. {
  51. if (rakNetGuid!=UNASSIGNED_RAKNET_GUID)
  52. return rakNetGuid.ToString();
  53. return systemAddress.ToString(writePort);
  54. }
  55. void AddressOrGUID::ToString(bool writePort, char *dest) const
  56. {
  57. if (rakNetGuid!=UNASSIGNED_RAKNET_GUID)
  58. return rakNetGuid.ToString(dest);
  59. return systemAddress.ToString(writePort,dest);
  60. }
  61. bool RakNet::NonNumericHostString( const char *host )
  62. {
  63. // Return false if IP address. Return true if domain
  64. unsigned int i=0;
  65. while (host[i])
  66. {
  67. // IPV4: natpunch.jenkinssoftware.com
  68. // IPV6: fe80::7c:31f7:fec4:27de%14
  69. if ((host[i]>='g' && host[i]<='z') ||
  70. (host[i]>='A' && host[i]<='Z'))
  71. return true;
  72. ++i;
  73. }
  74. return false;
  75. }
  76. SocketDescriptor::SocketDescriptor() {
  77. #ifdef __native_client__
  78. blockingSocket=false;
  79. #else
  80. blockingSocket=true;
  81. #endif
  82. port=0; hostAddress[0]=0; remotePortRakNetWasStartedOn_PS3_PSP2=0; extraSocketOptions=0; socketFamily=AF_INET;}
  83. SocketDescriptor::SocketDescriptor(unsigned short _port, const char *_hostAddress)
  84. {
  85. #ifdef __native_client__
  86. blockingSocket=false;
  87. #else
  88. blockingSocket=true;
  89. #endif
  90. remotePortRakNetWasStartedOn_PS3_PSP2=0;
  91. port=_port;
  92. if (_hostAddress)
  93. strcpy(hostAddress, _hostAddress);
  94. else
  95. hostAddress[0]=0;
  96. extraSocketOptions=0;
  97. socketFamily=AF_INET;
  98. }
  99. // Defaults to not in peer to peer mode for NetworkIDs. This only sends the localSystemAddress portion in the BitStream class
  100. // This is what you want for client/server, where the server assigns all NetworkIDs and it is unnecessary to transmit the full structure.
  101. // For peer to peer, this will transmit the systemAddress of the system that created the object in addition to localSystemAddress. This allows
  102. // Any system to create unique ids locally.
  103. // All systems must use the same value for this variable.
  104. //bool RAK_DLL_EXPORT NetworkID::peerToPeerMode=false;
  105. SystemAddress& SystemAddress::operator = ( const SystemAddress& input )
  106. {
  107. memcpy(&address, &input.address, sizeof(address));
  108. systemIndex = input.systemIndex;
  109. debugPort = input.debugPort;
  110. return *this;
  111. }
  112. bool SystemAddress::EqualsExcludingPort( const SystemAddress& right ) const
  113. {
  114. return (address.addr4.sin_family==AF_INET && address.addr4.sin_addr.s_addr==right.address.addr4.sin_addr.s_addr)
  115. #if RAKNET_SUPPORT_IPV6==1
  116. || (address.addr4.sin_family==AF_INET6 && memcmp(address.addr6.sin6_addr.s6_addr, right.address.addr6.sin6_addr.s6_addr, sizeof(address.addr6.sin6_addr.s6_addr))==0)
  117. #endif
  118. ;
  119. }
  120. unsigned short SystemAddress::GetPort(void) const
  121. {
  122. return ntohs(address.addr4.sin_port);
  123. }
  124. unsigned short SystemAddress::GetPortNetworkOrder(void) const
  125. {
  126. return address.addr4.sin_port;
  127. }
  128. void SystemAddress::SetPortHostOrder(unsigned short s)
  129. {
  130. address.addr4.sin_port=htons(s);
  131. debugPort=s;
  132. }
  133. void SystemAddress::SetPortNetworkOrder(unsigned short s)
  134. {
  135. address.addr4.sin_port=s;
  136. debugPort=ntohs(s);
  137. }
  138. bool SystemAddress::operator==( const SystemAddress& right ) const
  139. {
  140. return address.addr4.sin_port == right.address.addr4.sin_port && EqualsExcludingPort(right);
  141. }
  142. bool SystemAddress::operator!=( const SystemAddress& right ) const
  143. {
  144. return (*this==right)==false;
  145. }
  146. bool SystemAddress::operator>( const SystemAddress& right ) const
  147. {
  148. if (address.addr4.sin_port == right.address.addr4.sin_port)
  149. {
  150. #if RAKNET_SUPPORT_IPV6==1
  151. if (address.addr4.sin_family==AF_INET)
  152. return address.addr4.sin_addr.s_addr>right.address.addr4.sin_addr.s_addr;
  153. return memcmp(address.addr6.sin6_addr.s6_addr, right.address.addr6.sin6_addr.s6_addr, sizeof(address.addr6.sin6_addr.s6_addr))>0;
  154. #else
  155. return address.addr4.sin_addr.s_addr>right.address.addr4.sin_addr.s_addr;
  156. #endif
  157. }
  158. return address.addr4.sin_port>right.address.addr4.sin_port;
  159. }
  160. bool SystemAddress::operator<( const SystemAddress& right ) const
  161. {
  162. if (address.addr4.sin_port == right.address.addr4.sin_port)
  163. {
  164. #if RAKNET_SUPPORT_IPV6==1
  165. if (address.addr4.sin_family==AF_INET)
  166. return address.addr4.sin_addr.s_addr<right.address.addr4.sin_addr.s_addr;
  167. return memcmp(address.addr6.sin6_addr.s6_addr, right.address.addr6.sin6_addr.s6_addr, sizeof(address.addr6.sin6_addr.s6_addr))>0;
  168. #else
  169. return address.addr4.sin_addr.s_addr<right.address.addr4.sin_addr.s_addr;
  170. #endif
  171. }
  172. return address.addr4.sin_port<right.address.addr4.sin_port;
  173. }
  174. int SystemAddress::size(void)
  175. {
  176. #if RAKNET_SUPPORT_IPV6==1
  177. return sizeof(sockaddr_in6) + sizeof(char);
  178. #else
  179. return sizeof(uint32_t) + sizeof(unsigned short) + sizeof(char);
  180. #endif
  181. }
  182. unsigned long SystemAddress::ToInteger( const SystemAddress &sa )
  183. {
  184. unsigned int lastHash = SuperFastHashIncremental ((const char*) & sa.address.addr4.sin_port, sizeof(sa.address.addr4.sin_port), sizeof(sa.address.addr4.sin_port) );
  185. #if RAKNET_SUPPORT_IPV6==1
  186. if (sa.address.addr4.sin_family==AF_INET)
  187. return SuperFastHashIncremental ((const char*) & sa.address.addr4.sin_addr.s_addr, sizeof(sa.address.addr4.sin_addr.s_addr), lastHash );
  188. else
  189. return SuperFastHashIncremental ((const char*) & sa.address.addr6.sin6_addr.s6_addr, sizeof(sa.address.addr6.sin6_addr.s6_addr), lastHash );
  190. #else
  191. return SuperFastHashIncremental ((const char*) & sa.address.addr4.sin_addr.s_addr, sizeof(sa.address.addr4.sin_addr.s_addr), lastHash );
  192. #endif
  193. }
  194. unsigned char SystemAddress::GetIPVersion(void) const
  195. {
  196. if (address.addr4.sin_family==AF_INET)
  197. return 4;
  198. return 6;
  199. }
  200. unsigned int SystemAddress::GetIPPROTO(void) const
  201. {
  202. #if RAKNET_SUPPORT_IPV6==1
  203. if (address.addr4.sin_family==AF_INET)
  204. return IPPROTO_IP;
  205. return IPPROTO_IPV6;
  206. #else
  207. return IPPROTO_IP;
  208. #endif
  209. }
  210. void SystemAddress::SetToLoopback(void)
  211. {
  212. SetToLoopback(GetIPVersion());
  213. }
  214. void SystemAddress::SetToLoopback(unsigned char ipVersion)
  215. {
  216. if (ipVersion==4)
  217. {
  218. FromString(IPV4_LOOPBACK, 0, ipVersion);
  219. }
  220. else
  221. {
  222. FromString(IPV6_LOOPBACK, 0, ipVersion);
  223. }
  224. }
  225. bool SystemAddress::IsLoopback(void) const
  226. {
  227. if (GetIPVersion()==4)
  228. {
  229. // unsigned long l = htonl(address.addr4.sin_addr.s_addr);
  230. if (htonl(address.addr4.sin_addr.s_addr)==2130706433)
  231. return true;
  232. if (address.addr4.sin_addr.s_addr==0)
  233. return true;
  234. }
  235. #if RAKNET_SUPPORT_IPV6==1
  236. else
  237. {
  238. const static char localhost[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
  239. if (memcmp(&address.addr6.sin6_addr, localhost, 16)==0)
  240. return true;
  241. }
  242. #endif
  243. return false;
  244. }
  245. void SystemAddress::ToString_Old(bool writePort, char *dest, char portDelineator) const
  246. {
  247. if (*this==UNASSIGNED_SYSTEM_ADDRESS)
  248. {
  249. strcpy(dest, "UNASSIGNED_SYSTEM_ADDRESS");
  250. return;
  251. }
  252. char portStr[2];
  253. portStr[0]=portDelineator;
  254. portStr[1]=0;
  255. in_addr in;
  256. in.s_addr = address.addr4.sin_addr.s_addr;
  257. const char *ntoaStr = inet_ntoa( in );
  258. strcpy(dest, ntoaStr);
  259. if (writePort)
  260. {
  261. strcat(dest, portStr);
  262. Itoa(GetPort(), dest+strlen(dest), 10);
  263. }
  264. }
  265. const char *SystemAddress::ToString(bool writePort, char portDelineator) const
  266. {
  267. static unsigned char strIndex=0;
  268. #if RAKNET_SUPPORT_IPV6==1
  269. static char str[8][INET6_ADDRSTRLEN+5+1];
  270. #else
  271. static char str[8][22+5+1];
  272. #endif
  273. unsigned char lastStrIndex=strIndex;
  274. strIndex++;
  275. ToString(writePort, str[lastStrIndex&7], portDelineator);
  276. return (char*) str[lastStrIndex&7];
  277. }
  278. #if RAKNET_SUPPORT_IPV6==1
  279. void SystemAddress::ToString_New(bool writePort, char *dest, char portDelineator) const
  280. {
  281. int ret;
  282. (void) ret;
  283. if (*this==UNASSIGNED_SYSTEM_ADDRESS)
  284. {
  285. strcpy(dest, "UNASSIGNED_SYSTEM_ADDRESS");
  286. return;
  287. }
  288. if (address.addr4.sin_family==AF_INET)
  289. {
  290. ret=getnameinfo((struct sockaddr *) &address.addr4, sizeof(struct sockaddr_in), dest, 22, NULL, 0, NI_NUMERICHOST);
  291. }
  292. else
  293. {
  294. ret=getnameinfo((struct sockaddr *) &address.addr6, sizeof(struct sockaddr_in6), dest, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST);
  295. }
  296. if (ret!=0)
  297. {
  298. dest[0]=0;
  299. }
  300. if (writePort)
  301. {
  302. unsigned char ch[2];
  303. ch[0]=portDelineator;
  304. ch[1]=0;
  305. strcat(dest, (const char*) ch);
  306. Itoa(ntohs(address.addr4.sin_port), dest+strlen(dest), 10);
  307. }
  308. }
  309. #endif // #if RAKNET_SUPPORT_IPV6!=1
  310. void SystemAddress::ToString(bool writePort, char *dest, char portDelineator) const
  311. {
  312. #if RAKNET_SUPPORT_IPV6!=1
  313. ToString_Old(writePort,dest,portDelineator);
  314. #else
  315. ToString_New(writePort,dest,portDelineator);
  316. #endif // #if RAKNET_SUPPORT_IPV6!=1
  317. }
  318. SystemAddress::SystemAddress()
  319. {
  320. address.addr4.sin_family=AF_INET;
  321. // used for operator ==
  322. memset(&address,0,sizeof(address)); address.addr4.sin_family=AF_INET;
  323. systemIndex=(SystemIndex)-1;
  324. debugPort=0;
  325. }
  326. SystemAddress::SystemAddress(const char *str)
  327. {
  328. address.addr4.sin_family=AF_INET;
  329. SetPortHostOrder(0);
  330. FromString(str);
  331. systemIndex=(SystemIndex)-1;
  332. }
  333. SystemAddress::SystemAddress(const char *str, unsigned short port)
  334. {
  335. address.addr4.sin_family=AF_INET;
  336. FromStringExplicitPort(str,port);
  337. systemIndex=(SystemIndex)-1;
  338. }
  339. #ifdef _MSC_VER
  340. #pragma warning( disable : 4996 ) // The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _strnicmp. See online help for details.
  341. #endif
  342. void SystemAddress::FixForIPVersion(const SystemAddress &boundAddressToSocket)
  343. {
  344. char str[128];
  345. ToString(false,str);
  346. // TODO - what about 255.255.255.255?
  347. if (strcmp(str, IPV6_LOOPBACK)==0)
  348. {
  349. if (boundAddressToSocket.GetIPVersion()==4)
  350. {
  351. FromString(IPV4_LOOPBACK,0,4);
  352. }
  353. }
  354. else if (strcmp(str, IPV4_LOOPBACK)==0)
  355. {
  356. #if RAKNET_SUPPORT_IPV6==1
  357. if (boundAddressToSocket.GetIPVersion()==6)
  358. {
  359. FromString(IPV6_LOOPBACK,0,6);
  360. }
  361. #endif
  362. // if (boundAddressToSocket.GetIPVersion()==4)
  363. // {
  364. // // Some kind of bug with sendto: returns "The requested address is not valid in its context." if loopback doesn't have the same IP address
  365. // address.addr4.sin_addr.s_addr=boundAddressToSocket.address.addr4.sin_addr.s_addr;
  366. // }
  367. }
  368. }
  369. bool SystemAddress::IsLANAddress(void)
  370. {
  371. // return address.addr4.sin_addr.S_un.S_un_b.s_b1==10 || address.addr4.sin_addr.S_un.s_b1==192;
  372. #if defined(__WIN32__)
  373. return address.addr4.sin_addr.S_un.S_un_b.s_b1==10 || address.addr4.sin_addr.S_un.S_un_b.s_b1==192;
  374. #else
  375. return (address.addr4.sin_addr.s_addr >> 24) == 10 || (address.addr4.sin_addr.s_addr >> 24) == 192;
  376. #endif
  377. }
  378. bool SystemAddress::SetBinaryAddress(const char *str, char portDelineator)
  379. {
  380. if ( NonNumericHostString( str ) )
  381. {
  382. #if defined(_WIN32)
  383. if (_strnicmp(str,"localhost", 9)==0)
  384. #else
  385. if (strncasecmp(str,"localhost", 9)==0)
  386. #endif
  387. {
  388. address.addr4.sin_addr.s_addr=inet_addr__("127.0.0.1");
  389. if (str[9])
  390. {
  391. SetPortHostOrder((unsigned short) atoi(str+9));
  392. }
  393. return true;
  394. }
  395. //const char *ip = ( char* ) SocketLayer::DomainNameToIP( str );
  396. char ip[65];
  397. ip[0]=0;
  398. RakNetSocket2::DomainNameToIP(str, ip);
  399. if (ip[0])
  400. {
  401. address.addr4.sin_addr.s_addr=inet_addr__(ip);
  402. }
  403. else
  404. {
  405. *this = UNASSIGNED_SYSTEM_ADDRESS;
  406. return false;
  407. }
  408. }
  409. else
  410. {
  411. //#ifdef _XBOX
  412. // binaryAddress=UNASSIGNED_SYSTEM_ADDRESS.binaryAddress;
  413. //#else
  414. // Split the string into the first part, and the : part
  415. int index, portIndex;
  416. char IPPart[22];
  417. char portPart[10];
  418. // Only write the valid parts, don't change existing if invalid
  419. // binaryAddress=UNASSIGNED_SYSTEM_ADDRESS.binaryAddress;
  420. // port=UNASSIGNED_SYSTEM_ADDRESS.port;
  421. for (index=0; str[index] && str[index]!=portDelineator && index<22; index++)
  422. {
  423. if (str[index]!='.' && (str[index]<'0' || str[index]>'9'))
  424. break;
  425. IPPart[index]=str[index];
  426. }
  427. IPPart[index]=0;
  428. portPart[0]=0;
  429. if (str[index] && str[index+1])
  430. {
  431. index++;
  432. for (portIndex=0; portIndex<10 && str[index] && index < 22+10; index++, portIndex++)
  433. {
  434. if (str[index]<'0' || str[index]>'9')
  435. break;
  436. portPart[portIndex]=str[index];
  437. }
  438. portPart[portIndex]=0;
  439. }
  440. if (IPPart[0])
  441. {
  442. address.addr4.sin_addr.s_addr=inet_addr__(IPPart);
  443. }
  444. if (portPart[0])
  445. {
  446. address.addr4.sin_port=htons((unsigned short) atoi(portPart));
  447. debugPort=ntohs(address.addr4.sin_port);
  448. }
  449. //#endif
  450. }
  451. return true;
  452. }
  453. #ifdef _MSC_VER
  454. #pragma warning( disable : 4702 ) // warning C4702: unreachable code
  455. #endif
  456. bool SystemAddress::FromString(const char *str, char portDelineator, int ipVersion)
  457. {
  458. #if RAKNET_SUPPORT_IPV6!=1
  459. (void) ipVersion;
  460. return SetBinaryAddress(str,portDelineator);
  461. #else
  462. if (str==0)
  463. {
  464. memset(&address,0,sizeof(address));
  465. address.addr4.sin_family=AF_INET;
  466. return true;
  467. }
  468. #if RAKNET_SUPPORT_IPV6==1
  469. char ipPart[INET6_ADDRSTRLEN];
  470. #else
  471. char ipPart[INET_ADDRSTRLEN];
  472. #endif
  473. char portPart[32];
  474. int i=0,j;
  475. // TODO - what about 255.255.255.255?
  476. if (ipVersion==4 && strcmp(str, IPV6_LOOPBACK)==0)
  477. {
  478. strcpy(ipPart,IPV4_LOOPBACK);
  479. }
  480. else if (ipVersion==6 && strcmp(str, IPV4_LOOPBACK)==0)
  481. {
  482. address.addr4.sin_family=AF_INET6;
  483. strcpy(ipPart,IPV6_LOOPBACK);
  484. }
  485. else if (NonNumericHostString(str)==false)
  486. {
  487. for (; i < sizeof(ipPart) && str[i]!=0 && str[i]!=portDelineator; i++)
  488. {
  489. if ((str[i]<'0' || str[i]>'9') && (str[i]<'a' || str[i]>'f') && (str[i]<'A' || str[i]>'F') && str[i]!='.' && str[i]!=':' && str[i]!='%' && str[i]!='-' && str[i]!='/')
  490. break;
  491. ipPart[i]=str[i];
  492. }
  493. ipPart[i]=0;
  494. }
  495. else
  496. {
  497. strncpy(ipPart,str,sizeof(ipPart));
  498. ipPart[sizeof(ipPart)-1]=0;
  499. }
  500. j=0;
  501. if (str[i]==portDelineator && portDelineator!=0)
  502. {
  503. i++;
  504. for (; j < sizeof(portPart) && str[i]!=0; i++, j++)
  505. {
  506. portPart[j]=str[i];
  507. }
  508. }
  509. portPart[j]=0;
  510. // needed for getaddrinfo
  511. WSAStartupSingleton::AddRef();
  512. // This could be a domain, or a printable address such as "192.0.2.1" or "2001:db8:63b3:1::3490"
  513. // I want to convert it to its binary representation
  514. addrinfo hints, *servinfo=0;
  515. memset(&hints, 0, sizeof hints);
  516. hints.ai_socktype = SOCK_DGRAM;
  517. if (ipVersion==6)
  518. hints.ai_family = AF_INET6;
  519. else if (ipVersion==4)
  520. hints.ai_family = AF_INET;
  521. else
  522. hints.ai_family = AF_UNSPEC;
  523. getaddrinfo(ipPart, "", &hints, &servinfo);
  524. if (servinfo==0)
  525. {
  526. if (ipVersion==6)
  527. {
  528. ipVersion=4;
  529. hints.ai_family = AF_UNSPEC;
  530. getaddrinfo(ipPart, "", &hints, &servinfo);
  531. if (servinfo==0)
  532. return false;
  533. }
  534. else
  535. return false;
  536. }
  537. RakAssert(servinfo);
  538. unsigned short oldPort = address.addr4.sin_port;
  539. #if RAKNET_SUPPORT_IPV6==1
  540. if (servinfo->ai_family == AF_INET)
  541. {
  542. // if (ipVersion==6)
  543. // {
  544. // address.addr4.sin_family=AF_INET6;
  545. // memset(&address.addr6,0,sizeof(address.addr6));
  546. // memcpy(address.addr6.sin6_addr.s6_addr+12,&((struct sockaddr_in *)servinfo->ai_addr)->sin_addr.s_addr,sizeof(unsigned long));
  547. // }
  548. // else
  549. // {
  550. address.addr4.sin_family=AF_INET;
  551. memcpy(&address.addr4, (struct sockaddr_in *)servinfo->ai_addr,sizeof(struct sockaddr_in));
  552. // }
  553. }
  554. else
  555. {
  556. address.addr4.sin_family=AF_INET6;
  557. memcpy(&address.addr6, (struct sockaddr_in6 *)servinfo->ai_addr,sizeof(struct sockaddr_in6));
  558. }
  559. #else
  560. address.addr4.sin_family=AF_INET4;
  561. memcpy(&address.addr4, (struct sockaddr_in *)servinfo->ai_addr,sizeof(struct sockaddr_in));
  562. #endif
  563. freeaddrinfo(servinfo); // free the linked list
  564. // needed for getaddrinfo
  565. WSAStartupSingleton::Deref();
  566. // PORT
  567. if (portPart[0])
  568. {
  569. address.addr4.sin_port=htons((unsigned short) atoi(portPart));
  570. debugPort=ntohs(address.addr4.sin_port);
  571. }
  572. else
  573. {
  574. address.addr4.sin_port=oldPort;
  575. }
  576. #endif // #if RAKNET_SUPPORT_IPV6!=1
  577. return true;
  578. }
  579. bool SystemAddress::FromStringExplicitPort(const char *str, unsigned short port, int ipVersion)
  580. {
  581. bool b = FromString(str,(char) 0,ipVersion);
  582. if (b==false)
  583. {
  584. *this=UNASSIGNED_SYSTEM_ADDRESS;
  585. return false;
  586. }
  587. address.addr4.sin_port=htons(port);
  588. debugPort=ntohs(address.addr4.sin_port);
  589. return true;
  590. }
  591. void SystemAddress::CopyPort( const SystemAddress& right )
  592. {
  593. address.addr4.sin_port=right.address.addr4.sin_port;
  594. debugPort=right.debugPort;
  595. }
  596. RakNetGUID::RakNetGUID()
  597. {
  598. systemIndex=(SystemIndex)-1;
  599. *this=UNASSIGNED_RAKNET_GUID;
  600. }
  601. bool RakNetGUID::operator==( const RakNetGUID& right ) const
  602. {
  603. return g==right.g;
  604. }
  605. bool RakNetGUID::operator!=( const RakNetGUID& right ) const
  606. {
  607. return g!=right.g;
  608. }
  609. bool RakNetGUID::operator > ( const RakNetGUID& right ) const
  610. {
  611. return g > right.g;
  612. }
  613. bool RakNetGUID::operator < ( const RakNetGUID& right ) const
  614. {
  615. return g < right.g;
  616. }
  617. const char *RakNetGUID::ToString(void) const
  618. {
  619. static unsigned char strIndex=0;
  620. static char str[8][64];
  621. unsigned char lastStrIndex=strIndex;
  622. strIndex++;
  623. ToString(str[lastStrIndex&7]);
  624. return (char*) str[lastStrIndex&7];
  625. }
  626. void RakNetGUID::ToString(char *dest) const
  627. {
  628. if (*this==UNASSIGNED_RAKNET_GUID)
  629. strcpy(dest, "UNASSIGNED_RAKNET_GUID");
  630. else
  631. //sprintf(dest, "%u.%u.%u.%u.%u.%u", g[0], g[1], g[2], g[3], g[4], g[5]);
  632. sprintf(dest, "%" PRINTF_64_BIT_MODIFIER "u", (long long unsigned int) g);
  633. // sprintf(dest, "%u.%u.%u.%u.%u.%u", g[0], g[1], g[2], g[3], g[4], g[5]);
  634. }
  635. bool RakNetGUID::FromString(const char *source)
  636. {
  637. if (source==0)
  638. return false;
  639. #if defined(WIN32)
  640. g=_strtoui64(source, NULL, 10);
  641. #else
  642. // Changed from g=strtoull(source,0,10); for android
  643. g=strtoull(source, (char **)NULL, 10);
  644. #endif
  645. return true;
  646. }
  647. unsigned long RakNetGUID::ToUint32( const RakNetGUID &g )
  648. {
  649. return ((unsigned long) (g.g >> 32)) ^ ((unsigned long) (g.g & 0xFFFFFFFF));
  650. }
粤ICP备19079148号