llhost.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llhost.cpp
  3.  * @brief Encapsulates an IP address and a port.
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "linden_common.h"
  33. #include "llhost.h"
  34. #include "llerror.h"
  35. #if LL_WINDOWS
  36. #define WIN32_LEAN_AND_MEAN
  37. #include <winsock2.h>
  38. #else
  39. #include <netdb.h>
  40. #include <netinet/in.h> // ntonl()
  41. #include <sys/types.h>
  42. #include <sys/socket.h>
  43. #include <arpa/inet.h>
  44. #endif
  45. LLHost LLHost::invalid(INVALID_PORT,INVALID_HOST_IP_ADDRESS);
  46. LLHost::LLHost(const std::string& ip_and_port)
  47. {
  48. std::string::size_type colon_index = ip_and_port.find(":");
  49. if (colon_index == std::string::npos)
  50. {
  51. mIP = ip_string_to_u32(ip_and_port.c_str());
  52. mPort = 0;
  53. }
  54. else
  55. {
  56. std::string ip_str(ip_and_port, 0, colon_index);
  57. std::string port_str(ip_and_port, colon_index+1);
  58. mIP = ip_string_to_u32(ip_str.c_str());
  59. mPort = atol(port_str.c_str());
  60. }
  61. }
  62. std::string LLHost::getString() const
  63. {
  64. return llformat("%s:%u", u32_to_ip_string(mIP), mPort);
  65. }
  66. std::string LLHost::getIPandPort() const
  67. {
  68. return getString();
  69. }
  70. std::string LLHost::getIPString() const
  71. {
  72. return std::string( u32_to_ip_string( mIP ) );
  73. }
  74. std::string LLHost::getHostName() const
  75. {
  76. hostent* he;
  77. if (INVALID_HOST_IP_ADDRESS == mIP)
  78. {
  79. llwarns << "LLHost::getHostName() : Invalid IP address" << llendl;
  80. return std::string();
  81. }
  82. he = gethostbyaddr((char *)&mIP, sizeof(mIP), AF_INET);
  83. if (!he)
  84. {
  85. #if LL_WINDOWS
  86. llwarns << "LLHost::getHostName() : Couldn't find host name for address " << mIP << ", Error: " 
  87. << WSAGetLastError() << llendl;
  88. #else
  89. llwarns << "LLHost::getHostName() : Couldn't find host name for address " << mIP << ", Error: " 
  90. << h_errno << llendl;
  91. #endif
  92. return std::string();
  93. }
  94. else
  95. {
  96. return ll_safe_string(he->h_name);
  97. }
  98. }
  99. BOOL LLHost::setHostByName(const std::string& hostname)
  100. {
  101. hostent *he;
  102. std::string local_name(hostname);
  103. #if LL_WINDOWS
  104. // We may need an equivalent for Linux, but not sure - djs
  105. LLStringUtil::toUpper(local_name);
  106. #endif
  107. he = gethostbyname(local_name.c_str());
  108. if(!he) 
  109. {
  110. U32 ip_address = ip_string_to_u32(hostname.c_str());
  111. he = gethostbyaddr((char *)&ip_address, sizeof(ip_address), AF_INET);
  112. }
  113. if (he)
  114. {
  115. mIP = *(U32 *)he->h_addr_list[0];
  116. return TRUE;
  117. }
  118. else 
  119. {
  120. setAddress(local_name);
  121. // In windows, h_errno is a macro for WSAGetLastError(), so store value here
  122. S32 error_number = h_errno;
  123. switch(error_number) 
  124. {
  125. case TRY_AGAIN: // XXX how to handle this case? 
  126. llwarns << "LLHost::setAddress(): try again" << llendl;
  127. break;
  128. case HOST_NOT_FOUND:
  129. case NO_ADDRESS: // NO_DATA
  130. llwarns << "LLHost::setAddress(): host not found" << llendl;
  131. break;
  132. case NO_RECOVERY:
  133. llwarns << "LLHost::setAddress(): unrecoverable error" << llendl;
  134. break;
  135. default:
  136. llwarns << "LLHost::setAddress(): unknown error - " << error_number << llendl;
  137. break;
  138. }
  139. return FALSE;
  140. }
  141. }
  142. LLHost& LLHost::operator=(const LLHost &rhs)
  143. if (this != &rhs)
  144. {
  145. set(rhs.getAddress(), rhs.getPort());
  146. }
  147. return *this;
  148. }
  149. std::ostream& operator<< (std::ostream& os, const LLHost &hh)
  150. {
  151. os << u32_to_ip_string(hh.mIP) << ":" << hh.mPort ;
  152. return os;
  153. }
  154. //std::istream& operator>> (std::istream& is, LLHost &rh)
  155. //{
  156. // is >> rh.mIP;
  157. //    is >> rh.mPort;
  158. //    return is;
  159. //}