struct addrinfo 和 struct sockaddr 有啥区别
Posted
技术标签:
【中文标题】struct addrinfo 和 struct sockaddr 有啥区别【英文标题】:What is the difference between struct addrinfo and struct sockaddrstruct addrinfo 和 struct sockaddr 有什么区别 【发布时间】:2014-06-17 13:04:18 【问题描述】:据我了解,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
;
【问题讨论】:
【参考方案1】:struct addrinfo
由getaddrinfo()
返回,并在成功时包含指定主机名和/或服务的此类struct
s 的链接列表。
ai_addr
成员实际上并不是struct sockaddr
,因为struct
只是一个通用成员,其中包含所有其他成员的公共成员,用于确定您实际拥有的结构类型.根据您传递给getaddrinfo()
的内容以及该函数发现的内容,ai_addr
实际上可能是指向struct sockaddr_in
或struct sockaddr_in6
或其他任何内容的指针,具体取决于适用于该特定地址条目的内容。这是它们保持“分离”的一个很好的理由,因为该成员可能指向一堆不同类型的 struct
s 中的一个,如果您尝试将所有成员硬编码到 @987654332 中,则无法做到这一点@,因为那些不同的struct
s 有不同的成员。
如果您有主机名,这可能是获取此信息的最简单方法,但这不是唯一的方法。对于 IPv4 连接,您可以自己填充 struct sockaddr_in
结构,如果您愿意并且您有数据可以这样做,并且避免通过调用 getaddrinfo()
的繁琐,您可能需要等待如果它需要上网为您收集信息。您根本不必使用struct addrinfo
。
【讨论】:
如果您只知道主机名而不知道主机的 IP 地址,getaddrinfo() 是否也更有用?因为如果您是客户端(并且您知道服务器的 IP)并且您调用 getaddrinfo 并发送服务器的 IP 地址并且 getaddrinfo() 返回一个包含您已经知道的所有详细信息的 addrinfo 结构,这似乎有点重复?这条评论一定只是在重新陈述你所说的......对不起getaddrinfo()
如果您在 string 中包含 IP 地址,有时会很方便 - 比如说在命令行中输入它之后。您可以自己解析它并将其转换为struct sockaddr_in
要求的 32 位整数格式,但有时您可能会认为让getaddrinfo()
为您处理会更容易。如果您已经拥有可以输入struct sockaddr_in
格式的IP,那么调用getaddrinfo()
通常是毫无意义的。以上是关于struct addrinfo 和 struct sockaddr 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章
Golang中 struct{} 和 struct{}{}区别