#include <INETAddress.h>
Inheritance diagram for ASSA::INETAddress:
Public Types | |
enum | Protocol { TCP, UDP } |
Public Member Functions | |
INETAddress () | |
Default constructor. | |
INETAddress (struct in_addr *haddr_, int port_) | |
Constructor to create address on a client side given address in struct in_addr and integer port number. | |
INETAddress (const char *host_, int port_) | |
Constructor to create address on the client side given host name and integer port number. | |
INETAddress (const char *host_, const char *service_, Protocol protocol_=TCP) | |
Constructor to create address on the client side given host name and service name (as in /etc/services) and optionally protocol type. | |
INETAddress (int port_) | |
Constructor to create address of listening socket on a server side from integer port number. | |
INETAddress (const char *address_, Protocol protocol_=TCP) | |
Constructor to create address both client- and server-side addresses. | |
INETAddress (SA_IN *address_) | |
Copy constructor. | |
INETAddress (SA *address_) | |
Copy constructor from base address. | |
~INETAddress () | |
Destructor. | |
const int | getLength () const |
Return address length. | |
SA * | getAddress () const |
Get hold of address structure. | |
string | getHostName () |
Return host name. | |
int | getPort () const |
Return port. | |
void | dump () |
Dump the address content to log file. | |
Static Public Member Functions | |
static string | get_fully_qualified_domain_name (vector< string > &aliases_) |
Return fully-qualified host name. | |
Private Member Functions | |
void | createHostPort (const char *host_, int port_) |
Makes socket address out of host name and port. | |
int | getServiceByName (string serv_, Protocol prot_=TCP) |
Lookup port by its service name found in /etc/services. | |
void | init () |
Perform initialization common to all ctors. | |
Private Attributes | |
SA_IN | m_address |
Internet address structure sockaddr_in. | |
Static Private Attributes | |
static string | m_fqdn_cache |
Cached fully-qualified domain name. |
Definition at line 27 of file INETAddress.h.
|
Definition at line 30 of file INETAddress.h.
|
|
Default constructor.
Definition at line 34 of file INETAddress.cpp. References init(). 00035 { 00036 // trace_with_mask("INETAddress::INETAddress()",SOCKTRACE); 00037 init (); 00038 }
|
|
Constructor to create address on a client side given address in struct in_addr and integer port number.
Definition at line 85 of file INETAddress.cpp. References init(). 00086 { 00087 // trace_with_mask("INETAddress::INETAddress(in_addr*,port)",ADDRESS); 00088 00089 init (); 00090 m_address.sin_addr = *haddr_; 00091 m_address.sin_family = AF_INET; 00092 m_address.sin_port = htons(port_); 00093 }
|
|
Constructor to create address on the client side given host name and integer port number.
Definition at line 41 of file INETAddress.cpp. References createHostPort(), and init(). 00042 { 00043 // trace_with_mask("INETAddress::INETAddress(host, port)",SOCKTRACE); 00044 init (); 00045 createHostPort (host_, htons (port_)); 00046 }
|
|
Constructor to create address on the client side given host name and service name (as in /etc/services) and optionally protocol type.
Definition at line 49 of file INETAddress.cpp. References createHostPort(), getServiceByName(), and init(). 00050 { 00051 // trace_with_mask("INETAddress::INETAddress(host, port, protocol)", 00052 // SOCKTRACE); 00053 init (); 00054 createHostPort (host_, getServiceByName (service_,protocol_)); 00055 }
|
|
Constructor to create address of listening socket on a server side from integer port number.
Definition at line 58 of file INETAddress.cpp. References createHostPort(), and init(). 00059 { 00060 // trace_with_mask("INETAddress::INETAddress(port)",SOCKTRACE); 00061 00062 init (); 00063 createHostPort ("", htons (port_)); 00064 }
|
|
Constructor to create address both client- and server-side addresses. Address is derived from the character string address_ which can be specified in one of the following formats: Formats:
If host is omitted, wildcard (INADDR_ANY) address is assumed. This essentially creates an address of the server's listening socket. To create client-side address, use localhost (or host) name instead. service entry can be either port name as listed in /etc/services or integer port value.
Definition at line 96 of file INETAddress.cpp. References createHostPort(), getServiceByName(), and init(). 00097 { 00098 // trace_with_mask("INETAddress::INETAddress(address, protocol)",ADDRESS); 00099 00100 init (); 00101 00102 string s(address_); 00103 string sPort(s); 00104 int r = 0; 00105 string host; 00106 const u_int HOSTNAMELEN = 64; 00107 00108 #ifdef BLOCKED 00109 char buf[HOSTNAMELEN]; // 64 on Linux/i386 00110 if (gethostname (buf, HOSTNAMELEN) == 0) { 00111 host = buf; 00112 } 00113 #endif 00114 00115 if ( (r = s.find(':')) > 0 ) { // host:service 00116 host = s.substr(0, r); 00117 sPort = s.substr(r+1); 00118 } 00119 else if ( (r = s.find('@')) > 0 ) { // service@host 00120 sPort = s.substr(0, r); 00121 host = s.substr(r+1); 00122 } 00123 00124 if ( (r = getServiceByName (sPort)) == 0 ) { // service 00125 return; 00126 } 00127 00128 createHostPort (host.c_str(), r); 00129 }
|
|
Copy constructor.
Definition at line 67 of file INETAddress.cpp. References init(). 00068 { 00069 // trace_with_mask("INETAddress::INETAddress(SA_IN*)",SOCKTRACE); 00070 00071 init (); 00072 ::memcpy ((void*) &m_address, (const void*) address_, sizeof(SA_IN)); 00073 }
|
|
Copy constructor from base address.
Definition at line 76 of file INETAddress.cpp. References init(). 00077 { 00078 // trace_with_mask("INETAddress::INETAddress(SA*)",SOCKTRACE); 00079 00080 init (); 00081 ::memcpy ((void*) &m_address, (const void*) address_, sizeof(SA_IN)); 00082 }
|
|
Destructor.
Definition at line 102 of file INETAddress.h.
|
|
Makes socket address out of host name and port. Host name is either a host name, or an IPv4 address in standard dot notation, or an IPv6 address in colon (and possibly dot) notation. If it is in dot notation, no lookup is performed. Otherwise, lookup is performed by consulting name resolution services in order specified in in /etc/host.conf file (named(8) first, then /etc/hosts, and so on). Port port_ must be supplied in network-independent byte order. If host_ is an empty string, then local host name is assumed. If failed, state of the object is set to bad, and errno indicates the error occured. Definition at line 154 of file INETAddress.cpp. References ASSA::Address::badbit, EL, ASSA::ERROR, h_errno, and ASSA::Address::setstate(). Referenced by INETAddress(). 00155 { 00156 // trace_with_mask("INETAddress::createHostPort(char*,int)", ADDRESS); 00157 00158 struct hostent* hp = 0; 00159 00160 if (strlen (host_) == 0) { 00161 m_address.sin_addr.s_addr = htonl(INADDR_ANY); 00162 goto done; 00163 } 00164 00165 if ((hp = gethostbyname (host_)) == NULL) { 00166 setstate (Address::badbit); 00167 errno = h_errno; 00168 EL((ERROR,"gethostbyname (\"%s\") failed\n", host_)); 00169 return; 00170 } 00171 memcpy ((char*) &m_address.sin_addr, hp->h_addr_list[0], hp->h_length); 00172 00173 done: 00174 m_address.sin_family = AF_INET; 00175 m_address.sin_port = port_; 00176 }
|
|
Dump the address content to log file.
Reimplemented from ASSA::Address. Definition at line 201 of file INETAddress.cpp. References ASSA::ADDRESS, DL, ASSA::Address::dump(), getHostName(), and getPort(). 00202 { 00203 // trace_with_mask("INETAddress::dump", ADDRESS); 00204 00205 Address::dump (); 00206 DL((ADDRESS,"Family - %s\n", ntohs(m_address.sin_family) == AF_INET ? 00207 "AF_INET" : "AF_UNIX")); 00208 DL((ADDRESS,"host - %s\n", getHostName ().c_str())); 00209 DL((ADDRESS,"port - %d\n", getPort ())); 00210 DL((ADDRESS,"address - %s\n", inet_ntoa (m_address.sin_addr))); 00211 }
|
|
Return fully-qualified host name. Note that a host can have name aliases. If it does, they are returned via argument.
Definition at line 215 of file INETAddress.cpp. References ASSA::ADDRESS, EL, h_errno, and m_fqdn_cache. 00216 { 00217 // trace_with_mask ("INETAddress::get_fully_qualified_domain_name", ADDRESS); 00218 00219 if (m_fqdn_cache.length ()) { 00220 return m_fqdn_cache; 00221 } 00222 00223 struct utsname myname; 00224 struct hostent* hptr = NULL; 00225 00226 if (::uname (&myname) < 0) { 00227 EL((ADDRESS,"Hostname is not set!\n")); 00228 return m_fqdn_cache; 00229 } 00230 00231 if ((hptr = ::gethostbyname (myname.nodename)) == NULL) { 00232 errno = h_errno; 00233 EL((ADDRESS,"gethostbyname (%s) failed\n", myname.nodename)); 00234 return m_fqdn_cache; 00235 } 00236 m_fqdn_cache = hptr->h_name; 00237 char** pptr = hptr->h_aliases; 00238 while (*pptr != NULL) { 00239 aliases_.push_back (*pptr); 00240 pptr++; 00241 } 00242 00243 return m_fqdn_cache; 00244 }
|
|
Get hold of address structure.
Implements ASSA::Address. Definition at line 110 of file INETAddress.h. References m_address. Referenced by ASSA::ConUDPSocket::unconnect().
|
|
Return host name.
Definition at line 180 of file INETAddress.cpp. References ASSA::Address::badbit, EL, ASSA::ERROR, h_errno, and ASSA::Address::setstate(). Referenced by dump(). 00181 { 00182 if (m_address.sin_addr.s_addr == htonl(INADDR_ANY)) { 00183 return (""); 00184 } 00185 00186 struct hostent* hentry; 00187 hentry = gethostbyaddr ((const char*) &m_address.sin_addr, 00188 sizeof(m_address.sin_addr), 00189 AF_INET); 00190 if (hentry == NULL) { 00191 errno = h_errno; 00192 setstate (Address::badbit); 00193 EL((ERROR,"gethostbyaddr() failed\n")); 00194 return (""); 00195 } 00196 return hentry->h_name; 00197 }
|
|
Return address length.
Implements ASSA::Address. Definition at line 107 of file INETAddress.h. References m_address. 00107 { return sizeof (m_address); }
|
|
Return port.
Definition at line 116 of file INETAddress.h. References m_address. Referenced by dump(). 00116 { return ntohs (m_address.sin_port); }
|
|
Lookup port by its service name found in /etc/services. serv_ is either service name, or integer port number. If it is integer port number, it is converted to the network-independent byte order and no lookup is performed.
Definition at line 133 of file INETAddress.cpp. References ASSA::Address::badbit, ASSA::Address::setstate(), and TCP. Referenced by INETAddress(). 00134 { 00135 // trace_with_mask("INETAddress::getServiceByName", ADDRESS); 00136 00137 long l = 0; 00138 struct servent* sp = NULL; 00139 00140 if ((l = strtol (s_.c_str(), (char**) NULL, 10))) { 00141 return htons ((unsigned short int) l); 00142 } 00143 00144 if ((sp = getservbyname (s_.c_str(), (p_==TCP ? "tcp" : "udp")))) { 00145 return sp->s_port; 00146 } 00147 00148 setstate (Address::badbit); 00149 return 0; 00150 }
|
|
Perform initialization common to all ctors.
Definition at line 28 of file INETAddress.cpp. References m_address. Referenced by INETAddress().
|
|
Internet address structure sockaddr_in.
Definition at line 172 of file INETAddress.h. Referenced by getAddress(), getLength(), getPort(), and init(). |
|
Cached fully-qualified domain name.
Definition at line 168 of file INETAddress.h. Referenced by get_fully_qualified_domain_name(). |