00001 #include "address_old.h"
00002 #ifdef nonce
00003
00004 namespace n2nc {
00005 namespace net {
00006
00007 Address::Address() {
00008 memset(&m_ssaddr,0,sizeof(m_ssaddr)) ;
00009 }
00010
00011 Address::Address( std::string ipaddr ) {
00012 int ret ;
00013 memset(&m_ssaddr,0,sizeof(m_ssaddr)) ;
00014 if ( ret = setAddress(ipaddr) )
00015 throw gai_strerror(ret);
00016 }
00017
00018 Address::Address( const struct sockaddr_storage *addr_storage ){
00019 int ret ;
00020 memset(&m_ssaddr,0,sizeof(m_ssaddr)) ;
00021 if ( ret = setAddress(addr_storage) )
00022 throw gai_strerror(ret);
00023 }
00024
00025 Address::~Address(){
00026 }
00027
00028 int Address::setAddress(std::string addr){
00029 int ret ;
00030 if ( ret = retrieve_sockaddr_by_ip(addr,&m_ssaddr) ){
00031 m_ipaddress.clear() ;
00032 return ret ;
00033 }
00034 m_ipaddress = addr ;
00035 return ret ;
00036 }
00037
00038 int Address::setAddress( const struct sockaddr_storage *addr_storage ){
00039 int ret ;
00040 if ( ret = retrieve_ip_by_sockaddr((const struct sockaddr_in6 *)addr_storage, m_ipaddress ) ){
00041 m_ipaddress.clear() ;
00042 return ret ;
00043 }
00044 memset(&m_ssaddr,0,sizeof(m_ssaddr));
00045
00046 size_t siz = (addr_storage->ss_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6) );
00047 memcpy(&m_ssaddr,addr_storage,siz );
00048 return 0 ;
00049 }
00050
00051 inline int Address::retrieve_ip_by_sockaddr(const struct sockaddr_in6 *ss,std::string &ip){
00052 char s_ip[ADDRESS_IP_CHARSIZE];
00053 int ret ;
00054 size_t siz = (ss->sin6_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6) );
00055 ret = getnameinfo( (struct sockaddr*)ss, siz , s_ip, ADDRESS_IP_CHARSIZE, NULL, 0, NI_NUMERICHOST );
00056 ip = s_ip ;
00057 return ret ;
00058 }
00059
00060 inline int Address::retrieve_sockaddr_by_ip(std::string &ip, struct sockaddr_in6 *ss ){
00061 struct addrinfo hints, *ai ;
00062 int ret;
00063
00064 memset( &hints, 0, sizeof( hints ) );
00065 hints.ai_flags = AI_NUMERICHOST ;
00066 hints.ai_family = AF_UNSPEC;
00067 hints.ai_socktype = SOCK_STREAM;
00068
00069 ret = getaddrinfo( ip.c_str() , NULL , &hints, &ai );
00070 if ( ret ){
00071
00072 return ret ;
00073 }
00074 memcpy(ss,ai->ai_addr,ai->ai_addrlen);
00075 freeaddrinfo(ai);
00076 return ret ;
00077 }
00078
00079
00080 u_char Address::type(){
00081 if (m_ipaddress.empty()){ return NULL ; }
00082 return m_ssaddr.sin6_family ;
00083 }
00084
00085 struct sockaddr_storage *Address::tonet() {
00086 if (m_ipaddress.empty()){ return NULL ; }
00087 return (struct sockaddr_storage *)&m_ssaddr ;
00088 }
00089
00090 std::string Address::tostring(){
00091 return m_ipaddress ;
00092 }
00093
00094 void Address::dump_sockaddr(std::ostream &os){
00095 char s_ip[ADDRESS_IP_CHARSIZE];
00096 if (m_ipaddress.empty()) {
00097 os << "uninitialized\n" ;
00098 return ;
00099 }
00100 getnameinfo( (struct sockaddr*)&m_ssaddr, sizeof(m_ssaddr), s_ip, ADDRESS_IP_CHARSIZE, NULL, 0, NI_NUMERICHOST );
00101 os << "address family: " << m_ssaddr.sin6_family << (m_ssaddr.sin6_family == AF_INET ? " --> IPv4" : " --> IPv6") << endl ;
00102 os << "address name: " << m_ipaddress << endl ;
00103 os << "address name by sockaddr: " << s_ip << endl ;
00104 os << "**********************************************" << endl ;
00105 }
00106
00107 }
00108 }
00109 #endif