Из того, что я понимаю, struct addrinfo используется для подготовки структуры адреса сокета, а struct sockaddr содержит информацию о адресе сокета. Но что это значит? struct addrinfo содержит указатель на struct sockaddr. Зачем держать их отдельно? Почему мы не можем объединить все вещи в sockaddr в addr_info?
Я просто догадываюсь, но причина их разделения заключается в том, чтобы сэкономить место при передаче структур? Например, в вызове bind() все, что ему нужно, это номер порта и интернет-адрес. Таким образом, оба они сгруппированы в структуру sockaddr. Итак, мы можем просто передать эту небольшую структуру вместо более крупной структуры 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
};