Files
cdev-1.7.2n/extensions/cdevGenericServer/lib/cdevAddr.cc
2022-12-13 12:44:04 +01:00

191 lines
6.2 KiB
C++

#include "cdevAddr.h"
// *****************************************************************************
// * cdevInetAddr::set :
// * Allows the caller to set the address using a port number and
// * internet address.
// *****************************************************************************
int cdevInetAddr::set (unsigned short portnum, long ip_addr)
{
setType(AF_INET);
setSize(sizeof(inet_addr));
inet_addr.sin_family = AF_INET;
inet_addr.sin_port = htons(portnum);
if(ip_addr == INADDR_ANY) inet_addr.sin_addr.s_addr=INADDR_ANY;
else memcpy((void *)&inet_addr.sin_addr,
(void *)&ip_addr,
sizeof(inet_addr.sin_addr));
return 0;
}
// *****************************************************************************
// * cdevInetAddr::set :
// * Allows the caller to set the address using a port number and host name.
// *****************************************************************************
int cdevInetAddr::set (unsigned short portnum, const char hostname[])
{
hostent * server_info;
long addr;
int retval;
setType(AF_INET);
setSize(sizeof(inet_addr));
memset((void *)&inet_addr, 0, sizeof(inet_addr));
if(hostname==NULL || *hostname==0)
{
errno = EINVAL;
retval = -1;
}
else if((addr=::inet_addr(hostname))!=-1 ||
::strcmp(hostname, "255.255.255.255")==0)
{
retval = set(portnum, addr);
}
else if((server_info=::gethostbyname(hostname)) != 0)
{
::memcpy((void *)&addr, (void *)server_info->h_addr, server_info->h_length);
retval = set(portnum, addr);
}
else retval = -1;
return retval;
}
// *****************************************************************************
// * cdevInetAddr::set :
// * Allows the caller to set the address using a sockaddr_in structure
// * and its length.
// *****************************************************************************
int cdevInetAddr::set (const sockaddr_in *addr, int len)
{
setType(AF_INET);
setSize(len);
memcpy((void *)&inet_addr, (void *)addr, len);
return 0;
}
// *****************************************************************************
// * cdevInetAddr::cdevInetAddr :
// * This constructor creates an empty address object.
// *****************************************************************************
cdevInetAddr::cdevInetAddr ( void )
: cdevAddr(AF_INET, sizeof(sockaddr_in))
{
::memset((void *)&inet_addr, 0, sizeof(inet_addr));
}
// *****************************************************************************
// * cdevInetAddr::cdevInetAddr :
// * This constructor copies the contents of one cdevInetAddr object to
// * the new cdevInetAddr object.
// *****************************************************************************
cdevInetAddr::cdevInetAddr ( const cdevInetAddr & addr )
: cdevAddr(AF_INET, sizeof(inet_addr))
{
memcpy((void *)&inet_addr, (void *)&addr.inet_addr, sizeof(inet_addr));
}
// *****************************************************************************
// * cdevInetAddr::cdevInetAddr :
// * This constructor creates a new cdevInetAddr object that contains the
// * address provided in the sockaddr_in object.
// *****************************************************************************
cdevInetAddr::cdevInetAddr (const sockaddr_in *addr, int len)
{
set(addr, len);
}
// *****************************************************************************
// * cdevInetAddr::cdevInetAddr :
// * This constructor initializes the new cdevInetAddr object using the
// * specified port number and host name.
// *****************************************************************************
cdevInetAddr::cdevInetAddr (unsigned short portnum, char hostname[])
{
set(portnum, hostname);
}
// *****************************************************************************
// * cdevInetAddr::cdevInetAddr :
// * This constructor initializes the new cdevInetAddr object with the
// * specified port number and ip address.
// *****************************************************************************
cdevInetAddr::cdevInetAddr (unsigned short portnum, long ip_addr)
{
set(portnum, ip_addr);
}
// *****************************************************************************
// * cdevInetAddr::getHostName :
// * This method allows the caller to return the name of the host that
// * the cdevInetAddr structure identifies.
// *****************************************************************************
const char * cdevInetAddr::getHostName ( void ) const
{
char * retval;
hostent * hp;
int len = sizeof(inet_addr.sin_addr.s_addr);
if((hp = ::gethostbyaddr((char *)&inet_addr.sin_addr, len, addr_type))==0)
{
retval = NULL;
}
else retval = hp->h_name;
return retval;
}
// *****************************************************************************
// * cdevInetAddr::getHostAddr :
// * This method allows the caller to retrieve the internet address (in
// * string format) of the host that the cdevInetAddr object identifies.
// *****************************************************************************
const char * cdevInetAddr::getHostAddr ( void ) const
{
return ::inet_ntoa(inet_addr.sin_addr);
}
// *****************************************************************************
// * cdevInetAddr::getInetAddr :
// * This method allows the caller to obtain the internet address of the
// * host that the cdevInetAddr object identifies.
// *****************************************************************************
unsigned long cdevInetAddr::getInetAddr ( void ) const
{
return ntohl((unsigned long)inet_addr.sin_addr.s_addr);
}
// *****************************************************************************
// * cdevInetAddr::getPortNum :
// * This method allows the caller to retrieve the port number that is
// * associated with this cdevInetAddr.
// *****************************************************************************
unsigned short cdevInetAddr::getPortNum ( void ) const
{
return ntohs (inet_addr.sin_port);
}
// *****************************************************************************
// * cdevInetAddr::getAddress :
// * Returns the address of the sockaddr_in structure.
// *****************************************************************************
void * cdevInetAddr::getAddress ( void ) const
{
return (void *)&inet_addr;
}