Я работаю с некоторым кодом, который нашел, и пытаюсь понять логику for loop в этом.
Кажется, что цикл for не используется, и он всегда будет разрываться.Так что я не понимаю, какая информация возвращается из getaddrinfo (), что может привести к повторному циклу и проверке чего-либо?
Вопрос: В основном, что это за цикл пытается выполнить?Мне кажется, это просто проверка того, что список не равен NULL, потому что цикл не выполняется, никогда.
tcp_ctx* tcp_new_ctx(INT family, CHAR *host, CHAR *port) {
struct addrinfo *list = NULL;
struct addrinfo *e = NULL;
struct addrinfo hints;
tcp_ctx *c = NULL;
WSADATA wsa;
INT on = 1;
WSAStartup(MAKEWORD(2, 0), &wsa);
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = family;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
// try to resolve network address for host
//list contains linked list of addrinfo structs containing information on the host
if (getaddrinfo(host, port, &hints, &list) != 0) {
return NULL;
}
c = tcp_alloc(sizeof(tcp_ctx));
// Traverse linked list from getaddr info
for (e = list; e != NULL; e = e->ai_next) {
if (family == AF_INET) {
memcpy(&c->v4, e->ai_addr, e->ai_addrlen);
c->ai_addr = (SOCKADDR*)&c->v4;
} else if (family == AF_INET6) {
memcpy(&c->v6, e->ai_addr, e->ai_addrlen);
c->ai_addr = (SOCKADDR*)&c->v6;
} else {
return NULL;
}
c->ai_addrlen = e->ai_addrlen;
// create socket and event for signalling
c->s = socket(family, SOCK_STREAM, IPPROTO_TCP);
if (c->s != SOCKET_ERROR) {
// ensure we can reuse same port later
setsockopt(c->s, SOL_SOCKET, SO_REUSEADDR, (CHAR*)&on, sizeof(on));
}
break;
}
freeaddrinfo(list);
return c;
}