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 addrinfogetaddrinfo() 返回,并在成功时包含指定主机名和/或服务的此类structs 的链接列表。

ai_addr 成员实际上并不是struct sockaddr,因为struct 只是一个通用成员,其中包含所有其他成员的公共成员,用于确定您实际拥有的结构类型.根据您传递给getaddrinfo() 的内容以及该函数发现的内容,ai_addr 实际上可能是指向struct sockaddr_instruct sockaddr_in6 或其他任何内容的指针,具体取决于适用于该特定地址条目的内容。这是它们保持“分离”的一个很好的理由,因为该成员可能指向一堆不同类型的 structs 中的一个,如果您尝试将所有成员硬编码到 @987654332 中,则无法做到这一点@,因为那些不同的structs 有不同的成员。

如果您有主机名,这可能是获取此信息的最简单方法,但这不是唯一的方法。对于 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{}{}区别

go中的struct

C语言结构体中struct和typedef struct有啥区别?

struct ip与struct iphdr 有啥区别

struct和typedef struct

大数据之Hive:struct类型和named_struct类型