47 addr_.ss_family = AF_UNSPEC;
52 addr_.ss_family = AF_UNSPEC;
53 memcpy( &
addr_, address, len );
57 addr_.ss_family = AF_UNSPEC;
63 addr_.ss_family = AF_UNSPEC;
67 auto rc = inet_pton( AF_INET, address.c_str(), &
asIPv4Address()->sin_addr );
69 rc = inet_pton( AF_INET6, address.c_str(), &
asIPv6Address()->sin6_addr );
72 addr_.ss_family = AF_UNSPEC;
74 addr_.ss_family = AF_INET6;
77 addr_.ss_family = AF_INET;
93 if (
addr_.ss_family == address.
addr_.ss_family ) {
94 if (
addr_.ss_family == AF_INET ) {
97 return memcmp( local, other,
sizeof(sockaddr_in) ) == 0;
98 }
else if (
addr_.ss_family == AF_INET6 ) {
101 return memcmp( local, other,
sizeof(sockaddr_in6) ) == 0;
108 char ip_[INET6_ADDRSTRLEN];
109 std::stringstream ss;
110 if (
addr_.ss_family == AF_INET ) {
111 if ( !inet_ntop( AF_INET, &
asIPv4Address()->sin_addr, ip_,
sizeof(ip_) ) )
113 }
else if (
addr_.ss_family == AF_INET6 ) {
114 if ( !inet_ntop( AF_INET6, &
asIPv6Address()->sin6_addr, ip_,
sizeof(ip_) ) )
116 }
else if (
addr_.ss_family == AF_UNSPEC ) {
117 return "invalid address";
119 return "unhandled address family";
128 if (
addr_.ss_family == AF_INET ) {
130 }
else if (
addr_.ss_family == AF_INET6 ) {
137 if (
addr_.ss_family == AF_INET ) {
139 }
else if (
addr_.ss_family == AF_INET6 ) {
145 struct addrinfo *ainfo = 0;
146 struct addrinfo ahints;
147 memset( &ahints, 0,
sizeof(ahints) );
148 ahints.ai_family = AF_UNSPEC;
149 ahints.ai_flags = AI_CANONNAME | AI_CANONIDN | AI_ADDRCONFIG;
155 struct addrinfo *rp = 0;
156 for ( rp = ainfo; rp != NULL; rp = rp->ai_next ) {
162 if ( rp->ai_canonname ) info.
canonicalname = rp->ai_canonname;
163 info.
items.push_back( item );
165 if ( ainfo ) freeaddrinfo( ainfo );
169 if ( ainfo ) freeaddrinfo( ainfo );
171 freeaddrinfo( ainfo );
184 for (
auto item : info.
items ) {
186 if ( item.params.getSocketType() == params.
getSocketType() ) {
187 if ( item.params.getProtocol() == params.
getProtocol() ) {
189 address = item.address;
201 char hbuf[NI_MAXHOST];
202 auto error = getnameinfo( (
const sockaddr*) &
addr_,
210 if ( !error ) hostname = hbuf;
else hostname =
"";
215 char hbuf[NI_MAXHOST];
216 char sbuf[NI_MAXSERV];
217 auto error = getnameinfo( (
const sockaddr*) &
addr_,
225 if ( !error ) hostname = hbuf;
else hostname =
"";
230 char hbuf[NI_MAXHOST];
231 char sbuf[NI_MAXSERV];
232 auto error = getnameinfo( (
const sockaddr*) &
addr_,
238 NI_NAMEREQD | NI_NUMERICSERV );
243 int p = atoi( sbuf );
245 port =
static_cast<uint16_t
>( p );