ASSA::INETAddress Class Reference

#include <INETAddress.h>

Inheritance diagram for ASSA::INETAddress:

ASSA::Address

List of all members.

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.
SAgetAddress () 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.


Detailed Description

Definition at line 27 of file INETAddress.h.


Member Enumeration Documentation

enum ASSA::INETAddress::Protocol

Enumerator:
TCP  TCP protocol.
UDP  UDP protocol.

Definition at line 30 of file INETAddress.h.

00030                   { 
00031         TCP,                    
00032         UDP                     
00033     };


Constructor & Destructor Documentation

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.

Parameters:
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.

Parameters:
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.

Parameters:
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.

Parameters:
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.

Parameters:
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_  ) 

Copy constructor.

Definition at line 72 of file INETAddress.cpp.

References init(), and m_address.

00073 {
00074 //  trace_with_mask("INETAddress::INETAddress(SA_IN*)",SOCKTRACE);
00075 
00076     init ();
00077     ::memcpy ((void*) &m_address, (const void*) address_, sizeof(SA_IN));
00078 }

INETAddress::INETAddress ( SA address_  ) 

Copy constructor from base address.

Definition at line 81 of file INETAddress.cpp.

References init(), and m_address.

00082 {
00083 //  trace_with_mask("INETAddress::INETAddress(SA*)",SOCKTRACE);
00084 
00085     init ();
00086     ::memcpy ((void*) &m_address, (const void*) address_, sizeof(SA_IN));
00087 }

ASSA::INETAddress::~INETAddress (  )  [inline]

Destructor.

Definition at line 102 of file INETAddress.h.

00102                     { 
00103 //      trace_with_mask("INETAddress::~INETAddress",SOCKTRACE);
00104     }


Member Function Documentation

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().

00110 { return (SA*) &m_address; }

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.

Parameters:
aliases_ List of host aliases, if any
Returns:
fully-qualified host name.

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.

Parameters:
serv_ Service name.
prot_ Protocol: tcp (default) or udp.
Returns:
Port number in the network-independent byte order, or 0 if lookup failed.

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().

00034 {
00035     ::memset ((char*) &m_address, 0, sizeof(m_address));
00036 }


Member Data Documentation

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().


The documentation for this class was generated from the following files:
Generated on Mon Nov 5 08:02:14 2007 for libassa by  doxygen 1.5.3-20071008