00001 #include "socketaddress.h"
00002 #include "ip4address.h"
00003 #include "ip6address.h"
00004 namespace n2nc {
00005 namespace net {
00006
00007 SocketAddress::SocketAddress()
00008 {
00009 memset(&this->m_sa,0,sizeof(struct sockaddr_storage));
00010 }
00011
00012 SocketAddress::SocketAddress(struct sockaddr* sa){
00013 memset(&this->m_sa,0,sizeof(struct sockaddr_storage));
00014 switch(sa->sa_family){
00015 case (AF_INET):
00016 memcpy(&this->m_sa,sa,sizeof(struct sockaddr_in));
00017 break;
00018
00019 case (AF_INET6):
00020 memcpy(&this->m_sa,sa,sizeof(struct sockaddr_in6));
00021 break;
00022
00023 case (AF_UNIX):
00024 memcpy(&this->m_sa,sa,sizeof(struct sockaddr_un));
00025 break;
00026 }
00027 }
00028
00029 SocketAddress::SocketAddress(Address * addr, uint16_t port){
00030 std::cerr << "not implemented yet" << std::endl ;
00031
00032
00033
00034
00035
00036 }
00037
00038 Address* SocketAddress::getAddress(){
00039 Address *addr;
00040 struct in_addr *inaddr4 ;
00041 struct in6_addr *inaddr6 ;
00042
00043 switch(this->m_sa.ss_family){
00044 case (AF_INET):
00045 inaddr4 = &((struct sockaddr_in*)&this->m_sa)->sin_addr ;
00046 addr = new IP4Address( inaddr4 );
00047 break;
00048
00049 case (AF_INET6):
00050 inaddr6 = &((struct sockaddr_in6*)&this->m_sa)->sin6_addr ;
00051 addr = new IP6Address( inaddr6 );
00052 break;
00053
00054
00055
00056
00057 }
00058 return addr ;
00059 }
00060
00061 int SocketAddress::getAddressFamily(){
00062 return this->m_sa.ss_family ;
00063 }
00064
00065 struct sockaddr* SocketAddress::getRawSockAddr(){
00066 return (struct sockaddr*)&this->m_sa;
00067 }
00068
00069 int SocketAddress::getRawSockAddrLen(){
00070 size_t len ;
00071 switch (this->m_sa.ss_family){
00072 case(AF_INET):
00073 len = sizeof(struct sockaddr_in);
00074 break ;
00075 case(AF_INET6):
00076 len = sizeof(struct sockaddr_in6);
00077 break ;
00078 case(AF_UNIX):
00079 len = sizeof(struct sockaddr_un);
00080 break ;
00081 }
00082 return len ;
00083 }
00084
00085 std::string SocketAddress::toString(){
00086 std::ostringstream ss;
00087 Address *tmp_addr = this->getAddress();
00088 uint16_t sinport ;
00089 struct sockaddr_in* saddr ;
00090
00091 ss << tmp_addr->toString() ;
00092
00093 saddr = (struct sockaddr_in*)&this->m_sa ;
00094 sinport = ntohs( saddr->sin_port) ;
00095 ss << " Port: " << sinport ;
00096
00097 switch (this->m_sa.ss_family){
00098 case(AF_INET):
00099 ss << " AF: IPV4" ;
00100 break ;
00101 case(AF_INET6):
00102 ss << " AF: IPV6" ;
00103 break ;
00104 case(AF_UNIX):
00105 ss << " AF: UNIX" ;
00106 break ;
00107 }
00108
00109 delete tmp_addr ;
00110
00111
00112
00113 return ss.str();
00114 }
00115
00116
00117 SocketAddress::~SocketAddress()
00118 {
00119 }
00120
00121
00122
00123 }
00124 }
00125