socket servidor programming ejemplos cliente c sockets networking

servidor - ¿Cuál es la diferencia entre struct addrinfo y struct sockaddr?



socket programming python (1)

struct addrinfo es devuelta por getaddrinfo() y contiene, en caso de éxito, una lista enlazada de dichas struct para un nombre de host y / o servicio específico.

El miembro ai_addr no es en realidad una struct sockaddr , porque esa struct es simplemente una genérica que contiene miembros comunes para todos los demás, y se usa para determinar qué tipo de estructura realmente tiene. Dependiendo de lo que pase a getaddrinfo() y de lo que descubrió esa función, ai_addr podría ser un puntero a struct sockaddr_in , o struct sockaddr_in6 , o lo que sea, dependiendo de lo que sea apropiado para esa entrada de dirección particular. Esta es una buena razón por la que se mantienen "separados", ya que ese miembro podría apuntar a uno de varios tipos diferentes de struct , lo que no podría hacer si intentara codificar a todos los miembros en la struct addrinfo , porque Esas diferentes struct tienen diferentes miembros.

Esta es probablemente la forma más fácil de obtener esta información si tiene un nombre de host, pero no es la única. Para una conexión IPv4, puede rellenar una struct sockaddr_in usted mismo, si lo desea y tiene los datos para hacerlo, y evitar pasar por el rigamarole de llamar a getaddrinfo() , que podría tener que esperar si es necesario. Salir a internet para recopilar la información por usted. No tienes que usar struct addrinfo en absoluto.

Por lo que entiendo, struct addrinfo se usa para preparar la estructura de dirección de socket y struct sockaddr contiene información de dirección de socket. Pero, ¿qué significa eso realmente? struct addrinfo contiene un puntero a una estructura sockaddr. ¿Por qué mantenerlos separados? ¿Por qué no podemos combinar todas las cosas dentro de sockaddr en addr_info?

Estoy adivinando aquí, pero ¿la razón de su separación es para ahorrar espacio al pasar las estructuras? Por ejemplo, en la llamada bind (), todo lo que necesita es el número de puerto y la dirección de Internet. Así que ambos de estos se agrupan en una estructura sockaddr. Entonces, ¿podemos pasar esta pequeña estructura en lugar de la mayor estructura addrinfo?

struct addrinfo { int ai_flags; // AI_PASSIVE, AI_CANONNAME, etc. int ai_family; // AF_INET, AF_INET6, AF_UNSPEC int ai_socktype; // SOCK_STREAM, SOCK_DGRAM int ai_protocol; // use 0 for "any" size_t ai_addrlen; // size of ai_addr in bytes struct sockaddr *ai_addr; // struct sockaddr_in or _in6 char *ai_canonname; // full canonical hostname struct addrinfo *ai_next; // linked list, next node }; struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address };