Понимание фрагмента кода open_clientfd (char * hostname, char * port) из книги CSAPP? - PullRequest
0 голосов
/ 15 января 2019

Читая книгу <Компьютерные системы: перспектива программиста> и в главе «Сетевое программирование», я увидел эту функцию:

int open_clientfd(char *hostname, char *port) {
    int clientfd;
    struct addrinfo hints, *listp, *p;

    /* Get a list of potential server addresses */
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_socktype = SOCK_STREAM;  /* Open a connection */
    hints.ai_flags = AI_NUMERICSERV;  /* ... using a numeric port arg. */
    hints.ai_flags |= AI_ADDRCONFIG;  /* Recommended for connections */
    Getaddrinfo(hostname, port, &hints, &listp);

    /* Walk the list for one that we can successfully connect to */
    for (p = listp; p; p = p->ai_next) {

        /* Create the socket descriptor */
        if ((clientfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) 
            continue; /* Socket failed, try the next */
        if (connect(clientfd, p->ai_addr, p->ai_addrlen) != -1) 
            break; /* Success */
        Close(clientfd); /* Connect failed, try another */
    } 

    /* Clean up */
    Freeaddrinfo(listp);
    if (!p) /* All connects failed */
        return -1;
    else    /* The last connect succeeded */
        return clientfd;
}

что я не понимаю, так это вот эта строка Close(clientfd); /* Connect failed, try another */, потому что если создание сокета завершилось неудачно, оно продолжится, в случае успеха просто выйдет из цикла for, кажется, что эта строка никогда не получит шанс выполнить?

1 Ответ

0 голосов
/ 15 января 2019

Когда socket был успешным, вы открыли сокет. Если connect не удается, сокет все еще существует и должен быть закрыт. В следующем цикле цикла будет использоваться следующий адрес из списка, для которого могут потребоваться другие параметры для вызова socket. Вот почему существующий сокет не используется повторно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...