Лучший способ сделать это - использовать getaddrinfo
, что-то вроде
struct addrinfo params = { 0 };
params.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; // adjust
params.ai_family = AF_UNSPEC;
params.ai_socktype = SOCK_STREAM; // adjust
params.ai_protocol = IPPROTO_TCP; // adjust
struct addrinfo *addrs;
int status = getaddrinfo(ip.c_str(), port.c_str(), ¶ms, &addrs);
if (status == EAI_SYSTEM) {
fprintf(stderr, "%s:%s: %s\n", ip.c_str(), port.c_str(), strerror(errno));
return -1;
} else if (status) {
fprintf(stderr, "%s:%s: %s\n", ip.c_str(), port.c_str(), gai_strerror(status));
return -1;
}
for (struct addrinfo *ai = addrs; ai; ai = ai->ai_next) {
// do something with ai->ai_addr etc here
}
freeaddrinfo(addrs);
return 0;
. Вам нужно будет отрегулировать строки с пометкой «Adjust» для вашего приложения. Вам также потребуется указать номер порта (что неудобно, он принимает это как строку , потому что он также может принимать имя протокола).
Преимущества этого способа: : Каждая запись в связанном списке addrs
содержит все данные, необходимые для создания и подключения сокета к этому адресу; он легко обрабатывает IPv6 за вас; и, если вы уберете AI_NUMERICHOST
, он легко обработает доменные имена и для вас.