据我了解,struct addrinfo 用于准备套接字地址结构,struct sockaddr 包含套接字地址信息。但这究竟意味着什么? struct addrinfo 包含指向 struct sockaddr 的指针。为什么要把它们分开?为什么我们不能将 sockaddr 中的所有内容合并到 addr_info 中?
我只是在这里猜测,但它们分开的原因是为了在传递结构时节省空间吗?例如在 bind() 调用中,它只需要端口号和互联网地址。所以这两个都被分组在一个 struct 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
};
最佳答案
struct addrinfo
由 getaddrinfo()
返回,成功时,包含指定主机名的此类 struct
的链表和/或服务。
ai_addr
成员实际上并不是一个 struct sockaddr
,因为 struct
只是一个包含所有通用成员的通用成员其他人,并用于确定您实际拥有的结构类型。根据您传递给 getaddrinfo()
的内容,以及该函数发现的内容,ai_addr
实际上可能是指向 struct sockaddr_in
的指针,或者 struct sockaddr_in6
或其他任何内容,具体取决于适合该特定地址条目的内容。这是将它们保持“分开”的一个很好的原因,因为该成员可能指向一堆不同类型的 struct
中的一个,如果您尝试硬编码所有它就无法做到这一点成员到 struct addrinfo
中,因为那些不同的 struct
有不同的成员。
如果您有主机名,这可能是获取此信息的最简单方法,但这不是唯一方法。对于 IPv4 连接,您可以自己填充一个 struct sockaddr_in
结构,如果您愿意并且您有这样做的数据,并且避免通过调用 getaddrinfo()
,如果它需要进入互联网为您收集信息,您可能需要等待。您根本不必使用 struct addrinfo
。
关于c - struct addrinfo 和 struct sockaddr 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401147/