Is it necessary to attempt to connect to all addre

2019-04-06 04:09发布

Beej's Simple Client example code iterates over all IP addresses returned from getaddrinfo(), until it can connect to the first one. See the code below.

Is this always necessary, or is it OK to assume that we only have to try to connect to the first address returned by 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;
}

5条回答
男人必须洒脱
2楼-- · 2019-04-06 04:36

In addition to the other answers given above, consider the common case that for larger websites and so on, that multiple A records might be published, for redundancy purposes. If a connect() to the first address fails, you want to try the others as well.

查看更多
霸刀☆藐视天下
3楼-- · 2019-04-06 04:38

Yes, you should loop through all of them -- there's no guarantee that the first one (or whatever you pick) of the addresses will actually be valid. That's why it's done like that in the tutorial.

查看更多
孤傲高冷的网名
4楼-- · 2019-04-06 04:44

Yes, you should iterate over all the addresses - in particular, consider the case when the destination host has IPv6 addresses enabled but your local host does not. getaddrinfo() will return AF_INET6 family addresses, but then either the socket() or connect() call will fail.

It's also a possibility that your host supports multiple protocols implementing SOCK_STREAM (say, SCTP in addition to TCP) and the destination host does not - since you haven't set the ai_protocol member of the hints structure, addresses representing all protocols supporting SOCK_STREAM sockets will be returned.

查看更多
可以哭但决不认输i
5楼-- · 2019-04-06 04:44

Let look at tit this way... The server host you want to connect to may have several addresses associated with it, but the actual server program only listens on one of those addresses. If your client doesn't know the exact address the server program is listening to, you have to try all the addresses the host has until you find the correct one and can connect.

查看更多
疯言疯语
6楼-- · 2019-04-06 04:46

Assuming you are new to socket, at this point. Yes, it is crucial because after using getaddrinfo, you can retrieve a address info for further validation.

查看更多
登录 后发表回答