我对getaddrinfo的理解

来源:互联网 发布:avi转gif软件 编辑:程序博客网 时间:2024/05/21 15:05

getaddrinfo这个函数,从函数名上可以理解为获得地址信息。主要的作用就是通过“主机名”或者“服务名”获得地址的信息。

其实该函数返回的是一个结构体链表。而每个结构中含有有关地址的信息,不仅仅是地址。

其接口形式如下:

int getaddrinfo(const char *restrict host,const char *restrict service,const struct addrinfo *restrict hint,struct addrinfo **restrict res);

1.struct addrinfo {

   int                              ai_flags;

   int                              ai_family;

   int                              ai_socktype;

   int                              ai_protocol;

   socklent_t                ai_addrlen;

   struct  sockaddr    *ai_addr;

   char                         *ai_canonname;

   struct  addrinfo      *ai_next;

.....

};

从这个结构体看主要有:域、类型、地址、地址长度等信息

2.hint是作过滤作用的。为什么要过滤作用呢?因为满足某一主机名或者服务名的地址可能有多个,为了精确选取,去除其他的所以用该结构进行过滤。是由用户填写的,其只要填写ai_flags,ai_family,ai_socktype,ai_protocol这些字段或者其中一些,其他的均为0.

3.返回的结果就用res指定。注意:res的类型,他是指针的指针。因为返回的是一个结构体链表,而不单单是个addrinfo结构体。


4.如果想要得到一个用于显示的或者说是给人看的地址。这个函数还是不能满足要求的,还需要其他函数,比如inet_ntop的结合使用。


疑问:在网上看到这么一段话

如果本函数返回成功,那么由result参数指向的变量已被填入一个指针,它指向的是由其中的ai_next成员串联起来的addrinfo结构链表。可以导致返回多个addrinfo结构的情形有以下2个:
    1.    如果与hostname参数关联的地址有多个,那么适用于所请求地址簇的每个地址都返回一个对应的结构。
    2.    如果service参数指定的服务支持多个套接口类型,那么每个套接口类型都可能返回一个对应的结构,具体取决于hints结构的ai_socktype成员

不知道作如何理解:如果返回多个结构体 是不是这个函数会出错呢?如果不能出错,因为这个函数只有一个指针用于指定结果,那么多个结构体如何指定呢?


参考文献:《unix环境高级编程》第二版