struct addrinfo和struct sockaddr有什么区别

25 c sockets networking

根据我的理解,struct addrinfo用于准备套接字地址结构,struct sockaddr包含套接字地址信息.但这究竟意味着什么呢?struct addrinfo包含指向struct sockaddr的指针.为什么要将它们分开?为什么我们不能将sockaddr中的所有内容组合到addr_info中?

我只是在这里猜测,但他们分离的原因是为了在传递结构时节省空间?例如,在bind()调用中,它需要的只是端口号和Internet地址.所以这两个都分组在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
}; 
Run Code Online (Sandbox Code Playgroud)

Cro*_*man 17

struct addrinfogetaddrinfo()成功返回并包含struct指定主机名和/或服务的此类s 的链接列表.

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

如果您有主机名,这可能是获取此信息的最简单方法,但这不是唯一的方法.对于IPv4连接,您可以struct sockaddr_in自己填充结构,如果您愿意,并且您有数据要这样做,并且避免经历调用的严格要求getaddrinfo(),如果需要进入调用,您可能需要等待.互联网为您收集信息.您根本不必使用struct addrinfo.

  • 如果您在 *string* 中有 IP 地址,那么 `getaddrinfo()` 有时会很方便 - 比如在命令行输入它之后。您可以自己解析它并将其转换为 `struct sockaddr_in` 所需的 32 位整数格式,但有时您可能认为让 `getaddrinfo()` 为您做这件事更容易。如果您已经拥有某种格式的 IP,则可以将其放入“struct sockaddr_in”中,调用“getaddrinfo()”通常毫无意义。 (4认同)