c++ - What's the difference between sockaddr, sockaddr_in, and sockaddr_in6? -
i know sockaddr_in ipv4, , sockaddr_in6 ipv6. confusion me difference between sockaddr , sockaddr_in[6].
some functions accept sockaddr
, functions accept sockaddr_in
or sockaddr_in6
, so:
- what's rule?
- and why there need 2 different structures?
and because sizeof(sockaddr_in6) > sizeof(sockaddr) == sizeof(sockaddr_in)
.
- does mean should use sockaddr_in6 allocate memory in stack , cast sockaddr , sockaddr_in if need support ipv4 , ipv6?
one example is: have socket, , want string ip address of (it can ipv4 or ipv6).
we first call getsockname
addr
, call inet_ntop
based on addr.sa_family
.
is there wrong code snippet?
sockaddr_in6 addr_inv6; sockaddr* addr = (sockaddr*)&addr_inv6; sockaddr_in* addr_in = (sockaddr_in*)&addr_inv6; socklen_t len = sizeof(addr_inv6); getsockname(_socket, addr, &len); char ipstr[256]; if (addr->sa_family == af_inet6) { inet_ntop(addr_inv6.sin6_family, &addr_inv6.sin6_addr, ipstr, sizeof(ipstr)); // <<<<<<<<is line valid, getsockname expected sockaddr, use output parameter sockaddr_in6. } else { inet_ntop(addr_in->sin_family, &addr_in->sin_addr, ipstr, sizeof(ipstr)); }
sockaddr_in
, sockaddr_in6
both structures first member sockaddr
structure.
according c standard, address of structure , first member same, can cast pointer sockaddr_in(6)
in pointer sockaddr
.
functions taking sockaddr_in(6)
parameter may modify sockaddr
part, , functions taking sockaddr
parameter care part.
it's bit inheritance.
Comments
Post a Comment