据我所知,struct addrinfo用于准备套接字地址结构,struct sockaddr包含套接字地址信息。但这到底是什么意思呢?struct addrinfo包含指向struct sockaddr的指针。为什么要把它们分开呢?为什么我们不能将sockaddr中的所有内容都合并到addr_info中呢?
我只是猜测,分离它们的原因是不是为了在传递struct时节省空间?例如,在bind()调用中,它只需要端口号和internet地址。所以这两个被分组在一个struct sockaddr中。所以,我们可以只传递这个小的struct而不是更大的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
}; 发布于 2014-05-01 10:43:04
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()的繁琐工作,如果它需要到internet上为您收集信息,您可能必须等待。你根本不需要使用struct addrinfo。
https://stackoverflow.com/questions/23401147
复制相似问题