c getaddrinfo函数
系统
2585 0
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
c getaddrinfo函数
更多文章、技术交流、商务合作、联系博主
微信扫码或搜索:z360901061
微信扫一扫加我为好友
QQ号联系: 360901061
您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
【本文对您有帮助就好】元