c getaddrinfo函数

IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于IPv6。getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个addrinfo的结构(列表)指针而不是一个地址清单。这些addrinfo结构随后可由套接口函数直接使用。如此以来,getaddrinfo函数把协议相关性安全隐藏在这个库函数内部。应用程序只要处理由getaddrinfo函数填写的套接口地址结构。该函数在 POSIX规范中定义了。

1
  /*
头文件:
linux下#include <netdb.h>    windows下#include<ws2tcpip.h>
原型:
int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result );
功能:
能够处理名字到地址以及服务到端口这两种转换。
参数:
hostname——一个主机名或者地址串(IPv4的点分十进制串或者IPv6的16进制串);
service——十进制的端口号,或者已定义的服务名称如ftp、http等;
hints——可以是空指针,也可以是一个指向某个addrinfo结构体的指针,设置该参数以获得期望返回的信息类型;
result——本函数通过result指针返回一个指向addrinfo结构体链表的指针。
返回值:
0——成功,非0——出错。
*/

 

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  /*
name:getaddrinfo.c
*/

#include
 <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
int main(int argc, char **argv)
{
    /*判断命令行参数个数*/
    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s hostname\n",argv[0]);
        exit(1);
    }
 
    struct addrinfo *result, hint, *pointToResult;
    char ipAddr[16];
    int returnValue;
 
    bzero(&hint, sizeof(hint));
 
    /*设置hint以获取期望的类型*/
    hint.ai_family = AF_INET;
    hint.ai_socktype = SOCK_STREAM;
 
    returnValue =  getaddrinfo(argv[1], NULL, &hint, &result);
 
    /*是否成功获得信息*/
    if (returnValue != 0)
    {
        fprintf(stderr, "getaddrinfo: &s\n", gai_strerror(returnValue));
        exit(1);
    }
 
    /*将获得的地址以表达格式输出*/
    for (pointToResult = result; pointToResult != NULL; pointToResult = pointToResult->ai_next)
    {
        inet_ntop(AF_INET, &(((struct sockaddr_in *)(pointToResult->ai_addr))->sin_addr), ipAddr, 16);
        printf("%s\n", ipAddr);
    }
 
    freeaddrinfo(result);
    exit(0);
}

/*
输入:
./getaddrinfo ubuntu

输出:

127.0.0.1
127.0.1.1
192.168.77.172
*/


 

参考:

http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881693.html

相关函数:

gethostbyname

gethostbyaddr

getservbyport

getservbyname

getaddrinfo

getnameinfo

posted @ 2012-09-14 11:45  helloweworld  阅读(1099)  评论(0编辑  收藏  举报