getaddrinfo介绍

来源:互联网 发布:leg引擎源码 编辑:程序博客网 时间:2024/06/03 21:32

一.  getaddrinfo

函数原型:

int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
参数说明:
     node:主机名或域名(如:www.baidu.com)
     service:端口号,一般直接给NULL
     hints:调用者在struct addrinfo结构中填入关于期望返回的信息类型的暗示(可以是NULL指针)
          例如:如果指定的服务既支持TCP也支持UDP,可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅仅是适用于数据报套接口的信息。
     res:本函数通过res指针参数返回一个指向struct addrinfo结构体链表的指针。(同一个域名解析可能会有多个IP地址)
       返回值:0——成功,非0——出错

struct addrinfo结构体

struct addrinfo {int              ai_flags;int              ai_family;// AF_INET 或 AF_INET6int              ai_socktype;// SOCK_STREAM 或 SOCK_DGRAMint              ai_protocol;socklen_t        ai_addrlen;struct sockaddr *ai_addr;char            *ai_canonname;struct addrinfo *ai_next;};

二. gai_strerror

const char *gai_strerror(int errcode);
该函数以getaddrinfo返回的非0错误值为参数,返回一个指向对应的出错信息串的指针

三. freeaddrinfo

void freeaddrinfo(struct addrinfo *res);
res参数应指向由getaddrinfo返回的第一个addrinfo结构。这个链表中的所有结构以及它们指向的任何动态存储空间都被释放掉。


代码示例:

#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netdb.h>int main(int argc, char **argv){if (argc != 2) {printf("Usage: %s hostname\n", argv[1]);return -1;}int ret;char szIpBuf[32];struct addrinfo stHints;struct addrinfo *pstResult = NULL, *pstCurAddr = NULL;//填充stHints结构体bzero(&stHints, sizeof(stHints));stHints.ai_family = AF_INET;stHints.ai_socktype = SOCK_STREAM;//解析域名得到IP地址组成的链表ret = getaddrinfo(argv[1], NULL, &stHints, &pstResult);if(0 != ret){printf("getaddrinfo failed. [err: %s]\n", gai_strerror(ret));return -1;}//遍历IP链表for(pstCurAddr = pstResult; pstCurAddr != NULL; pstCurAddr = pstCurAddr->ai_next){inet_ntop(AF_INET, &(((struct sockaddr_in *)(pstCurAddr->ai_addr))->sin_addr), szIpBuf, sizeof(szIpBuf));printf("%s对应的IP地址为:%s\n", argv[1], szIpBuf);}freeaddrinfo(pstResult);return 0;}