Ответ 1
struct addrinfo
возвращается getaddrinfo()
и содержит при успехе связанный список такого struct
для указанного имени хоста и/или службы.
Элемент ai_addr
на самом деле не является struct sockaddr
, потому что struct
является просто общим, который содержит общие члены для всех остальных, и используется для определения того, какой тип структуры вы на самом деле имеете, В зависимости от того, что вы переходите на getaddrinfo()
и что эта функция обнаружила, ai_addr
может фактически быть указателем на struct sockaddr_in
или struct sockaddr_in6
или что-то еще, в зависимости от того, что подходит для этой конкретной записи адреса. Это одна из веских причин, по которым они сохраняются "отдельно", потому что этот член может указывать на одну из нескольких типов struct
s, которые он не мог бы сделать, если бы вы попытались скопировать все члены в struct addrinfo
, потому что у разных struct
есть разные члены.
Это, вероятно, самый простой способ получить эту информацию, если у вас есть имя хоста, но это не единственный способ. Для подключения IPv4 вы можете просто заполнить структуру struct sockaddr_in
самостоятельно, если хотите, и у вас есть данные, чтобы сделать это, и не пропустите римарол вызова getaddrinfo()
, который вам, возможно, придется ждать, если он необходимо выйти в Интернет, чтобы собрать информацию для вас. Вам не нужно использовать struct addrinfo
вообще.