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 34 of file INETAddress.cpp.

References init().

00035 {
00036 //  trace_with_mask("INETAddress::INETAddress()",SOCKTRACE);
00037     init ();
00038 }

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 85 of file INETAddress.cpp.

References init(), and m_address.

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 }

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 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 }

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 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 }

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 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 }

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:

  • [host:]service
  • service[@host]

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 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 
00107 #ifdef BLOCKED
00108     const u_int HOSTNAMELEN = 64;
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 }

INETAddress::INETAddress SA_IN address_  ) 
 

Copy constructor.

Definition at line 67 of file INETAddress.cpp.

References init(), and m_address.

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 }

INETAddress::INETAddress SA address_  ) 
 

Copy constructor from base address.

Definition at line 76 of file INETAddress.cpp.

References init(), and m_address.

00077 {
00078 //  trace_with_mask("INETAddress::INETAddress(SA*)",SOCKTRACE);
00079 
00080     init ();
00081     ::memcpy ((void*) &m_address, (const void*) address_, sizeof(SA_IN));
00082 }

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

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 154 of file INETAddress.cpp.

References ASSA::Address::badbit, EL, ASSA::ERROR, h_errno, m_address, 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 }

void INETAddress::dump  )  [virtual]
 

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(), getPort(), and m_address.

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 }

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 215 of file INETAddress.cpp.

References 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 }

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 180 of file INETAddress.cpp.

References ASSA::Address::badbit, EL, ASSA::ERROR, h_errno, m_address, 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 }

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); }

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); }

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 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 }

void INETAddress::init  )  [private]
 

Perform initialization common to all ctors.

Definition at line 28 of file INETAddress.cpp.

References m_address.

Referenced by INETAddress().

00029 {
00030     ::memset ((char*) &m_address, 0, sizeof(m_address));
00031 }


Member Data Documentation

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

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


The documentation for this class was generated from the following files:
Generated on Wed Jun 21 01:42:52 2006 for libassa by  doxygen 1.4.6