getaddrinfo函数

来源:互联网 发布:centos 目录结构 编辑:程序博客网 时间:2024/05/16 17:37
这几天在看公司代码的时候,遇到gethostbyname函数。在查看过程中,发现这是一个“过时的”函数,已经被替代为getaddrinfo。因此转为主要研究getaddrinfor函数。

首先来看getaddrinfo在man中的定义:
       #include <sys/types.h>       #include <sys/socket.h>       #include <netdb.h>       int getaddrinfo(const char *node, const char *service,                       const struct addrinfo *hints,                       struct addrinfo **res);

对于函数的参数,结合APUE和man手册,node为主机名字,service为服务名字,这两个至少要提供一个。如果仅仅提供一个,则另一个要为NULL。主机名可以是hostname,也可以是点分制表示的主机地址。service可以为服务名字(/etc/services)也可以是端口号(字符串)。

getaddrinfo函数根据提供的hints来选择地址,返回一个结构为addrinfo的链表。可以用freeaddrinfo来释放一个或多个这种结构。hints类似一个用户过滤的模板,仅使用结构体中的ai_family, ai_flags, ai_protocol和ai_socktype字段,其余字段根据其性质置为0或NULL。

下面是addrinfo结构体:
struct addrinfo {               int              ai_flags;               int              ai_family;               int              ai_socktype;               int              ai_protocol;               size_t           ai_addrlen;               struct sockaddr *ai_addr;               char            *ai_canonname;               struct addrinfo *ai_next;           };

ai_family:AF_INET或者AF_INT6。
ai_socktype:SOCK_STREAM或者SOCK_DGRAM。
ai_protocal:0表示任意协议。
ai_flags比较复杂,包括以下:
AI_ALL:查找IPv4,IPv6地址。
AI_CANONNAME:需要一个规范名,而不是别名。
AI_NUMERICHOST:以数字形式返回主机地址。
AI_NUMERICSERV:同上。
AI_PASSIVE:套接字地址用户监听。

如果getaddrinfo函数调用失败,需要用gai_strerror函数返回错误原因:
const char *gai_strerror(int errcode);