c - struct addrinfo 和 struct sockaddr 有什么区别

标签 c sockets networking

据我了解,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
}; 

最佳答案

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

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

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

关于c - struct addrinfo 和 struct sockaddr 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401147/

相关文章:

c# - 来自 C# 线程创建/删除的 DllMain 调用似乎不平衡?

对 K&R c 关于类型转换的解释感到困惑

c - 为什么这个程序输出 Yes,而它应该抛出错误或 NO

javascript - 如何反转 d3 的线性比例?

java - flash() OutputStreamWriter 对网络的副作用

c++ - 如何使用 Qt 5.2 (C++) 快速检查网络路径

c# - C# 和 C 程序之间的命名管道通信失败

node.js - 如何在node.js中连接unix-socket时捕获错误

sockets - 简单的非阻塞 Web 服务器

c++ - C/C++ : Write and Read Sockets