#include <INETAddress.h>
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.
INETAddress::INETAddress | ( | ) |
Default constructor.
Definition at line 39 of file INETAddress.cpp.
References init().
00040 { 00041 // trace_with_mask("INETAddress::INETAddress()",SOCKTRACE); 00042 init (); 00043 }
INETAddress::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.
haddr_ | XDR-encoded server host address structure | |
port_ | Server listening port |
Definition at line 90 of file INETAddress.cpp.
References init(), and m_address.
00091 { 00092 // trace_with_mask("INETAddress::INETAddress(in_addr*,port)",ADDRESS); 00093 00094 init (); 00095 m_address.sin_addr = *haddr_; 00096 m_address.sin_family = AF_INET; 00097 m_address.sin_port = htons(port_); 00098 }
INETAddress::INETAddress | ( | const char * | host_, | |
int | port_ | |||
) |
Constructor to create address on the client side given host name and integer port number.
host_ | server host name | |
port_ | port server listens on |
Definition at line 46 of file INETAddress.cpp.
References createHostPort(), and init().
00047 { 00048 // trace_with_mask("INETAddress::INETAddress(host, port)",SOCKTRACE); 00049 init (); 00050 createHostPort (host_, htons (port_)); 00051 }
INETAddress::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.
host_ | Server host name | |
service_ | Server listening port | |
protocol_ | protocol: TCP (default) or UDP |
Definition at line 54 of file INETAddress.cpp.
References createHostPort(), getServiceByName(), and init().
00055 { 00056 // trace_with_mask("INETAddress::INETAddress(host, port, protocol)", 00057 // SOCKTRACE); 00058 init (); 00059 createHostPort (host_, getServiceByName (service_,protocol_)); 00060 }
INETAddress::INETAddress | ( | int | port_ | ) |
Constructor to create address of listening socket on a server side from integer port number.
port_ | port to use |
Definition at line 63 of file INETAddress.cpp.
References createHostPort(), and init().
00064 { 00065 // trace_with_mask("INETAddress::INETAddress(port)",SOCKTRACE); 00066 00067 init (); 00068 createHostPort ("", htons (port_)); 00069 }
INETAddress::INETAddress | ( | const char * | address_, | |
Protocol | protocol_ = TCP | |||
) |
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.
address_ | Address string. | |
protocol_ | Protocol: TCP (by default) or UDP. |
Definition at line 101 of file INETAddress.cpp.
References createHostPort(), getServiceByName(), and init().
00102 { 00103 // trace_with_mask("INETAddress::INETAddress(address, protocol)",ADDRESS); 00104 00105 init (); 00106 00107 string s(address_); 00108 string sPort(s); 00109 int r = 0; 00110 string host; 00111 00112 #ifdef BLOCKED 00113 const u_int HOSTNAMELEN = 64; 00114 char buf[HOSTNAMELEN]; // 64 on Linux/i386 00115 if (gethostname (buf, HOSTNAMELEN) == 0) { 00116 host = buf; 00117 } 00118 #endif 00119 00120 if ( (r = s.find(':')) > 0 ) { // host:service 00121 host = s.substr(0, r); 00122 sPort = s.substr(r+1); 00123 } 00124 else if ( (r = s.find('@')) > 0 ) { // service@host 00125 sPort = s.substr(0, r); 00126 host = s.substr(r+1); 00127 } 00128 00129 if ( (r = getServiceByName (sPort)) == 0 ) { // service 00130 return; 00131 } 00132 00133 createHostPort (host.c_str(), r); 00134 }
INETAddress::INETAddress | ( | SA_IN * | address_ | ) |
INETAddress::INETAddress | ( | SA * | address_ | ) |
ASSA::INETAddress::~INETAddress | ( | ) | [inline] |
const int ASSA::INETAddress::getLength | ( | ) | const [inline, virtual] |
Return address length.
Implements ASSA::Address.
Definition at line 107 of file INETAddress.h.
References m_address.
00107 { return sizeof (m_address); }
SA* ASSA::INETAddress::getAddress | ( | ) | const [inline, virtual] |
Get hold of address structure.
Implements ASSA::Address.
Definition at line 110 of file INETAddress.h.
References m_address.
Referenced by ASSA::ConUDPSocket::unconnect().
string INETAddress::getHostName | ( | ) |
Return host name.
Definition at line 185 of file INETAddress.cpp.
References ASSA::ASSAERR, ASSA::Address::badbit, EL, h_errno, m_address, and ASSA::Address::setstate().
Referenced by dump().
00186 { 00187 if (m_address.sin_addr.s_addr == htonl(INADDR_ANY)) { 00188 return (""); 00189 } 00190 00191 struct hostent* hentry; 00192 hentry = gethostbyaddr ((const char*) &m_address.sin_addr, 00193 sizeof(m_address.sin_addr), 00194 AF_INET); 00195 if (hentry == NULL) { 00196 errno = h_errno; 00197 setstate (Address::badbit); 00198 EL((ASSAERR,"gethostbyaddr() failed\n")); 00199 return (""); 00200 } 00201 return hentry->h_name; 00202 }
int ASSA::INETAddress::getPort | ( | ) | const [inline] |
Return port.
Definition at line 116 of file INETAddress.h.
References m_address.
Referenced by dump().
00116 { return ntohs (m_address.sin_port); }
void INETAddress::dump | ( | void | ) | [virtual] |
Dump the address content to log file.
Reimplemented from ASSA::Address.
Definition at line 206 of file INETAddress.cpp.
References ASSA::ADDRESS, DL, ASSA::Address::dump(), getHostName(), getPort(), and m_address.
00207 { 00208 // trace_with_mask("INETAddress::dump", ADDRESS); 00209 00210 Address::dump (); 00211 DL((ADDRESS,"Family - %s\n", ntohs(m_address.sin_family) == AF_INET ? 00212 "AF_INET" : "AF_UNIX")); 00213 DL((ADDRESS,"host - %s\n", getHostName ().c_str())); 00214 DL((ADDRESS,"port - %d\n", getPort ())); 00215 DL((ADDRESS,"address - %s\n", inet_ntoa (m_address.sin_addr))); 00216 }
string INETAddress::get_fully_qualified_domain_name | ( | vector< string > & | aliases_ | ) | [static] |
Return fully-qualified host name.
Note that a host can have name aliases. If it does, they are returned via argument.
aliases_ | List of host aliases, if any |
Definition at line 231 of file INETAddress.cpp.
References ASSA::ADDRESS, EL, h_errno, and m_fqdn_cache.
00232 { 00233 // trace_with_mask ("INETAddress::get_fully_qualified_domain_name", ADDRESS); 00234 00235 if (m_fqdn_cache.length ()) { 00236 return m_fqdn_cache; 00237 } 00238 00239 struct utsname myname; 00240 struct hostent* hptr = NULL; 00241 00242 #if defined(WIN32) 00243 DWORD slen; 00244 slen = sizeof (myname.nodename) - 1; 00245 GetComputerNameA (myname.nodename, &slen); 00246 #else 00247 if (::uname (&myname) < 0) { 00248 EL((ADDRESS,"Hostname is not set!\n")); 00249 return m_fqdn_cache; 00250 } 00251 #endif 00252 00253 if ((hptr = ::gethostbyname (myname.nodename)) == NULL) { 00254 errno = h_errno; 00255 EL((ADDRESS,"gethostbyname (%s) failed\n", myname.nodename)); 00256 return m_fqdn_cache; 00257 } 00258 m_fqdn_cache = hptr->h_name; 00259 char** pptr = hptr->h_aliases; 00260 while (*pptr != NULL) { 00261 aliases_.push_back (*pptr); 00262 pptr++; 00263 } 00264 00265 return m_fqdn_cache; 00266 }
void INETAddress::createHostPort | ( | const char * | host_, | |
int | port_ | |||
) | [private] |
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 159 of file INETAddress.cpp.
References ASSA::ASSAERR, ASSA::Address::badbit, EL, h_errno, m_address, and ASSA::Address::setstate().
Referenced by INETAddress().
00160 { 00161 // trace_with_mask("INETAddress::createHostPort(char*,int)", ADDRESS); 00162 00163 struct hostent* hp = 0; 00164 00165 if (strlen (host_) == 0) { 00166 m_address.sin_addr.s_addr = htonl(INADDR_ANY); 00167 goto done; 00168 } 00169 00170 if ((hp = gethostbyname (host_)) == NULL) { 00171 setstate (Address::badbit); 00172 errno = h_errno; 00173 EL((ASSAERR,"gethostbyname (\"%s\") failed\n", host_)); 00174 return; 00175 } 00176 memcpy ((char*) &m_address.sin_addr, hp->h_addr_list[0], hp->h_length); 00177 00178 done: 00179 m_address.sin_family = AF_INET; 00180 m_address.sin_port = port_; 00181 }
int INETAddress::getServiceByName | ( | string | serv_, | |
Protocol | prot_ = TCP | |||
) | [private] |
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.
serv_ | Service name. | |
prot_ | Protocol: tcp (default) or udp. |
Definition at line 138 of file INETAddress.cpp.
References ASSA::Address::badbit, ASSA::Address::setstate(), and TCP.
Referenced by INETAddress().
00139 { 00140 // trace_with_mask("INETAddress::getServiceByName", ADDRESS); 00141 00142 long l = 0; 00143 struct servent* sp = NULL; 00144 00145 if ((l = strtol (s_.c_str(), (char**) NULL, 10))) { 00146 return htons ((unsigned short int) l); 00147 } 00148 00149 if ((sp = getservbyname (s_.c_str(), (p_==TCP ? "tcp" : "udp")))) { 00150 return sp->s_port; 00151 } 00152 00153 setstate (Address::badbit); 00154 return 0; 00155 }
void INETAddress::init | ( | ) | [private] |
Perform initialization common to all ctors.
Definition at line 33 of file INETAddress.cpp.
References m_address.
Referenced by INETAddress().
string INETAddress::m_fqdn_cache [static, private] |
Cached fully-qualified domain name.
Definition at line 168 of file INETAddress.h.
Referenced by get_fully_qualified_domain_name().
SA_IN ASSA::INETAddress::m_address [private] |
Internet address structure sockaddr_in.
Definition at line 172 of file INETAddress.h.
Referenced by createHostPort(), dump(), getAddress(), getHostName(), getLength(), getPort(), INETAddress(), and init().