首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字编程中struct addrinfo{}中链表的用途

套接字编程中struct addrinfo{}中链表的用途
EN

Stack Overflow用户
提问于 2014-02-15 21:00:23
回答 2查看 1.2K关注 0票数 2

我正在读Beejs' Guide to Network Programming

我很难理解linkedlist的用途,也就是这个结构的最后一个参数:

代码语言: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
};

这有什么必要呢?下一个节点是指下一个客户端还是什么?

EN

回答 2

Stack Overflow用户

发布于 2014-02-15 21:09:19

一台主机可以有多个IP地址。例如一个IPv4和一个IPv6地址,或者多个IPv4地址。因此,getaddrinfo()为您提供了一个指向一个或多个addrinfo结构的链表的指针,ai_next是指向下一个元素的指针,或者NULL是列表中最后一个元素的指针。

示例(打印主机的所有IP地址):

代码语言:javascript
复制
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_protocol = IPPROTO_TCP;
struct addrinfo *addrs, *addr;

getaddrinfo("www.google.com", NULL, &hints, &addrs);
// addrs points to first addrinfo structure.

// Traverse the linked list:
for (addr = addrs; addr != NULL; addr = addr->ai_next) {

    char host[NI_MAXHOST];
    getnameinfo(addr->ai_addr, addr->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
    printf("%s\n", host);

}
freeaddrinfo(addrs);

(为简洁起见,省略了错误检查。)

票数 7
EN

Stack Overflow用户

发布于 2014-02-15 21:10:04

每个地址信息专用于匹配节点和服务的每个网络地址,并且它们通过ai_next彼此链接

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

https://stackoverflow.com/questions/21797913

复制
相关文章

相似问题

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