Лучший способ - использовать getaddrinfo()
.
Псевдокод:
struct addrinfo *restrict hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM };
struct addrinfo * res, r;
if (0 == getaddrinfo("foo.bar.baz", "http", &hints, &res)) {
for (r=res; r; r=r->ai_next) {
sock = socket(r->ai_family, r->ai_socktype, r->ai_protocol);
connect(sock, r->ai_addr, r->ai_addrlen);
if error: continue
break
}
}
freeaddrinfo(res);
Это избавит вас от беспокойства по поводу sin6_scope_id
; обычно это 0
, за исключением случаев, когда у вас есть локальные адреса, такие как fe80::1234:56ff:fe78:9abc%eth2
. eth2
преобразуется в правильный идентификатор области.
sin6_flowinfo
устарел (AFAIK) и, таким образом, установлен в 0 в результате struct addrinfo
ai_addr
.