/*
* InetAddress.h
* Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
*/
// SOL++2000
#pragma once
#include <sol\Object.h>
#include <sol\String.h>
#include <sol\StringT.h>
/**
* InetAddress class
*/
namespace SOL {
class InetAddress :public Object {
private:
sockaddr_in address;
StringT<char> dottedAddress; //1999.08.06
public:
/**
*
*/
InetAddress() {
memset(&address, 0, sizeof(address));
}
public:
/**
* Given port(in host byte order) only as an argument, address is INADDR_ANY.
*/
//2008/07/11
InetAddress(unsigned short port)
{
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = htonl(INADDR_ANY);
//INADDR_ANY is really a 0x00000000,so htonl(INADDR_ANY)=INADDR_ANY
address.sin_port = htons(port);
}
public:
/**
* @param host Internet host name
* @param port Port number(in host byte order)
*/
InetAddress(const char* host, unsigned short port)
{
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
if (host) {
unsigned long addr = inet_addr(host);
if(addr == INADDR_NONE) {
HOSTENT* hostEnt = gethostbyname(host);
if(hostEnt == NULL) {
throw Exception("InetAddress#InetAddress,1,Error in resolving address", 0);
}
address.sin_addr = *((LPIN_ADDR)*hostEnt->h_addr_list);
}
} else {
//If host were NULL, throw the followig exception
throw InvalidArgumentException("InetAddress#InetAddress,2,host name is NULL", 0);
}
address.sin_port = htons(port);
}
public:
// The port and addr must be in host-byte-order.
InetAddress(unsigned short port, unsigned long addr)
{
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons(port);
address.sin_addr.s_addr = htonl(addr);
}
sockaddr_in* getAddress() {
return &address;
}
int getSize() {
return sizeof(address);
}
unsigned long getHostAddress() {
return address.sin_addr.s_addr;
}
const char* getDottedAddress() {
dottedAddress = inet_ntoa(address.sin_addr);
return (const char*)dottedAddress;
}
unsigned short getPort() {
return address.sin_port;
}
void setAddress(unsigned long addr) {
address.sin_addr.s_addr = addr;
}
void setPort(unsigned short port) {
address.sin_port = port;
}
};
}
|