Почему структура addrinfo должна быть частично заполнена перед использованием для нее getaddrinfo()?

Я следил за Руководством Beej по сетевому программированию, и у меня возникли проблемы с пониманием того, почему мы должны заполнять некоторые поля структуры addrinfo перед вызовом getaddrinfo()? Кроме того, почему он возвращает указатель на список нескольких структур addrinfo? Поскольку есть только один хост, почему существует несколько адресов?


person J Min    schedule 17.09.2016    source источник
comment
Что касается обратной части: это функция, которая должна работать в любых условиях, поэтому она должна быть общей. Хост может иметь несколько NIC. Но даже если он всего один, записей может быть несколько. Попробуйте ipconfig -all (под Win) или ifconfig -a (под Linux); каждая из выходных записей соответствует одной из структур addrinfo (поэтому у вас почти всегда будет более 1). Что касается первого арта, вы можете прочитать getaddrinfo руководства: Ux или Win.   -  person CristiFati    schedule 18.09.2016
comment
Поскольку есть только один хост, почему вы так говорите?   -  person xaxxon    schedule 18.09.2016


Ответы (1)


почему мы должны заполнить некоторые поля структуры addrinfo перед вызовом getaddrinfo()?

Я предполагаю, что вы спрашиваете о параметре hints. Этот параметр можно использовать для указания типа ответа, который вы хотите получить от getaddrinfo(). Например, хотите ли вы, чтобы DNS-поиск выполнялся только для IPv4 (AF_INET) или для IPv6 (AF_INET6) из справочная страница:

Аргумент hints указывает на структуру addrinfo, которая определяет критерии выбора структур адресов сокетов, возвращаемых в списке, на который указывает res. Если hints не равен NULL, он указывает на структуру addrinfo, чьи ai_family, ai_socktype и ai_protocol определяют критерии, ограничивающие набор адресов сокетов, возвращаемых функцией getaddrinfo(), следующим образом:

   ai_family   This field specifies the desired address family for the
               returned addresses.  Valid values for this field include
               AF_INET and AF_INET6.  The value AF_UNSPEC indicates that
               getaddrinfo() should return socket addresses for any
               address family (either IPv4 or IPv6, for example) that
               can be used with node and service.

   ai_socktype This field specifies the preferred socket type, for
               example SOCK_STREAM or SOCK_DGRAM.  Specifying 0 in this
               field indicates that socket addresses of any type can be
               returned by getaddrinfo().

   ai_protocol This field specifies the protocol for the returned socket
               addresses.  Specifying 0 in this field indicates that
               socket addresses with any protocol can be returned by
               getaddrinfo().

   ai_flags    This field specifies additional options, described below.
               Multiple flags are specified by bitwise OR-ing them
               together.

   All the other fields in the structure pointed to by hints must
   contain either 0 or a null pointer, as appropriate.

почему он возвращает указатель на список нескольких структур addrinfo? Поскольку есть только один хост, почему существует несколько адресов?

Доменные имена часто разрешаются более чем в один IP-адрес. Например, у меня stackoverflow.com на данный момент резолвится на следующие адреса:

$ nslookup stackoverflow.com
Non-authoritative answer:
Server:  UnKnown
Address:  10.0.0.138

Name:    stackoverflow.com
Addresses:  151.101.65.69
          151.101.129.69
          151.101.1.69
          151.101.193.69

Все эти адреса — stackoverflow.com.

person Malt    schedule 22.09.2016