Почему структура addrinfo должна быть частично заполнена перед использованием getaddrinfo()?
Я следовал Руководству Beej по сетевому программированию и мне трудно понять, почему мы должны заполнить некоторые поля struct addrinfo перед вызовом getaddrinfo()? Кроме того, почему он возвращает указатель на список нескольких структур addrinfo? Поскольку существует только один хост, почему существует несколько адресов?
1 ответ
почему мы должны заполнить некоторые поля struct 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-адрес. Например, для меня, stackru.com
, на данный момент разрешает по следующим адресам:
$ nslookup stackru.com
Non-authoritative answer:
Server: UnKnown
Address: 10.0.0.138
Name: stackru.com
Addresses: 151.101.65.69
151.101.129.69
151.101.1.69
151.101.193.69
Все эти адреса являются stackru.com