¿Es necesario intentar conectarse a todas las direcciones devueltas por getaddrinfo ()?

El código de ejemplo del Cliente Simple de Beej itera sobre todas las direcciones IP devueltas desde getaddrinfo (), hasta que se puede conectar a la primera. Vea el código a continuación.

¿Es esto siempre necesario o está bien suponer que solo tenemos que intentar conectarnos a la primera dirección devuelta por 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; } 

Sí, debe iterar sobre todas las direcciones, en particular, considere el caso cuando el host de destino tiene habilitadas las direcciones IPv6 pero su host local no. getaddrinfo() devolverá las AF_INET6 familia AF_INET6 , pero luego la llamada a socket() o connect() fallará.

También es posible que su host admita múltiples protocolos que implementen SOCK_STREAM (por ejemplo, SCTP además de TCP) y el host de destino no, ya que no ha configurado el miembro ai_protocol de la estructura de sugerencias, las direcciones que representan todos los protocolos compatibles con SOCK_STREAM sockets SOCK_STREAM ser devueltos.

Además de las otras respuestas dadas anteriormente, considere el caso común de que para sitios web más grandes, etc., se puedan publicar múltiples registros A, por razones de redundancia. Si falla una connect() a la primera dirección, también desea probar las otras.

Dejémosle un vistazo de esta manera … El servidor host al que desea conectarse puede tener varias direcciones asociadas, pero el progtwig del servidor real solo escucha en una de esas direcciones. Si su cliente no sabe la dirección exacta que está escuchando el progtwig del servidor, debe probar todas las direcciones que tiene el host hasta que encuentre la correcta y pueda conectarse.

Sí, debería recorrer todos ellos; no hay garantía de que la primera (o lo que elija) de las direcciones sea válida. Es por eso que se hace así en el tutorial.

Suponiendo que eres nuevo en socket, en este punto. Sí, es crucial porque después de usar getaddrinfo, puede recuperar una información de dirección para una validación adicional.