Beej's Simple Client示例代碼遍歷從getaddrinfo()返回的所有IP地址,直到它可以連接到第一個。請參閱下面的代碼。是否需要嘗試連接到由getaddrinfo()返回的所有地址?
這是否總是必要的,或者可以假設我們只需要嘗試連接getaddrinfo()返回的第一個地址?
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return 1;
}
// ------------------------------------------------------------
// loop through all the results and connect to the first we can
for(p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
perror("client: socket");
continue;
}
if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
perror("client: connect");
continue;
}
break;
}
實際上,爲什麼主機可能有多個地址?最明顯的用途是冗餘。如果第一臺主機沒有響應,你可能會獲得更好的成功,如果你走的清單... – asveikau 2012-07-20 05:56:47
@asveikau主機有多個地址的實際原因可能會有所不同。這可能是因爲冗餘,或者它可能是服務於兩個不同的網絡,或許多其他原因。 – 2012-07-20 06:04:14
冗餘或負載平衡。 – Lothar 2014-03-23 15:57:11