2016-09-17 6 views
0

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

+0

Что касается возвращения части: это FUNC, который должен работать в любых условиях поэтому он должен быть общим. Хост может иметь несколько _NIC_ s. Но даже если он имеет только один, может быть несколько записей. Попробуйте 'ipconfig -all' (под _Win_) или' ifconfig -a' (под _Linux_); каждая из выходных записей соответствует одной из 'addrinfo' struct (так что вы почти всегда будете иметь больше 1). Что касается 1-го искусства, вы можете прочитать руководства 'getaddrinfo': [Ux] (http://man7.org/linux/man-pages/man3/getaddrinfo.3.html) или [Win] (https: // msdn. microsoft.com/en-us/library/windows/desktop/ms738520(v=vs.85).aspx). – CristiFati

+0

«Поскольку есть только один хозяин», почему вы так говорите? – xaxxon

ответ

0

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

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

намеками аргумент указывает на структуру, которая определяет addrinfo критерии для выбора адреса сокета структуры, возвращенные в списке , на который указывает res. Если подсказки не 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