[ntp:questions] Pool returns IPv6 address to IPv4 query
uwe at klein-habertwedt.de
Wed Nov 20 22:05:59 UTC 2013
> Brian Utterback <brian.utterback at oracle.com> wrote:
>>On 11/19/2013 3:40 PM, Danny Mayer wrote:
>>>You should not be using literal IP addresses of either flavor without
>>>also setting the AI_NUMERICHOST flag otherwise it tries to do a DNS
>>>lookup. That's poorly written code otherwise.
>>Not so. The getaddrinfo function will recognize literal addresses and
>>merely convert them. The point is that for something like ssh or any
>>other network utility, the user is supposed to give a hostname, but in
>>virtually all cases you can give a literal address and the application
>>does not have to treat it differently. If you read the ipng mailing
>>list, you will see that they were trying to make the whole process of
>>writing a network application simpler, with getaddrinfo doing the heavy
>>lifting for all of the major cases. At the same time they were trying to
>>allow applications to work on either IPv4 or IPv6 systems without
>>changing them, or dual stack or any combination. But no matter what they
>>did there were edge cases that needed to work differently.
> Well most of it was successfull, I converted an application from the
> old functions to getaddrinfo/getnameinfo etc, and it really is more
> convenient to program for.
> However, what I don't understand is why an IPv6 address does not fit
> into a struct sockaddr, and why this fact is so badly documented.
> It took me a lot of time to find why my queried IPv6 addresses were
struct sockaddr was a catch all and you had to also hand the size of the
storage into the call.
int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
if you look into sys/socket.h
# define __SOCKADDR_ALLTYPES \
__SOCKADDR_ONETYPE (sockaddr) \
__SOCKADDR_ONETYPE (sockaddr_at) \
__SOCKADDR_ONETYPE (sockaddr_ax25) \
__SOCKADDR_ONETYPE (sockaddr_dl) \
__SOCKADDR_ONETYPE (sockaddr_eon) \
__SOCKADDR_ONETYPE (sockaddr_in) \
__SOCKADDR_ONETYPE (sockaddr_in6) \
__SOCKADDR_ONETYPE (sockaddr_inarp) \
__SOCKADDR_ONETYPE (sockaddr_ipx) \
__SOCKADDR_ONETYPE (sockaddr_iso) \
__SOCKADDR_ONETYPE (sockaddr_ns) \
__SOCKADDR_ONETYPE (sockaddr_un) \
you'll see that there is a range of possible returns depending on protocol.
More information about the questions