据我所了解,结构体addrinfo用于准备套接字地址结构,而结构体sockaddr包含套接字地址信息。但这实际上是什么意思呢?struct addrinfo包含指向struct sockaddr的指针。为什么要将它们分开?我们为什么不能将sockaddr中的所有内容合并到addr_info中?
我只是猜测,它们被分开的原因是在传递结构时节省空间。例如,在bind()调用中,它只需要端口号和Internet地址。因此,这两者被分组在一个结构体sockaddr中。因此,我们只需传递这个小的结构体,而不是较大的struct addrinfo结构体吗?
我只是猜测,它们被分开的原因是在传递结构时节省空间。例如,在bind()调用中,它只需要端口号和Internet地址。因此,这两者被分组在一个结构体sockaddr中。因此,我们只需传递这个小的结构体,而不是较大的struct 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
};
getaddrinfo()
有时非常方便。您可以自己解析它并将其转换为struct sockaddr_in
所需的32位整数格式,但有时您可能认为让getaddrinfo()
来做这件事更容易。如果您已经将IP地址格式化为可以放入struct sockaddr_in
的格式,则调用getaddrinfo()
通常是没有意义的。 - Crowman