首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >struct addrinfo和struct sockaddr有什么区别

struct addrinfo和struct sockaddr有什么区别
EN

Stack Overflow用户
提问于 2014-05-01 10:22:22
回答 1查看 27.8K关注 0票数 34

据我所知,struct addrinfo用于准备套接字地址结构,struct sockaddr包含套接字地址信息。但这到底是什么意思呢?struct addrinfo包含指向struct sockaddr的指针。为什么要把它们分开呢?为什么我们不能将sockaddr中的所有内容都合并到addr_info中呢?

我只是猜测,分离它们的原因是不是为了在传递struct时节省空间?例如,在bind()调用中,它只需要端口号和internet地址。所以这两个被分组在一个struct sockaddr中。所以,我们可以只传递这个小的struct而不是更大的struct addrinfo?

代码语言:javascript
复制
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
}; 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-01 10:43:04

struct addrinfogetaddrinfo()返回,并在成功时包含指定主机名和/或服务的此类struct的链表。

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

如果您有主机名,这可能是获取此信息的最简单方法,但这不是唯一的方法。对于IPv4连接,您可以自己填充struct sockaddr_in结构,如果您想这样做,并且您有这样做的数据,并且避免了调用getaddrinfo()的繁琐工作,如果它需要到internet上为您收集信息,您可能必须等待。你根本不需要使用struct addrinfo

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23401147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档