c getaddrinfo函數(shù)
系統(tǒng)
2107 0
IPv4中使用
gethostbyname()函數(shù)
完成主機(jī)名到地址解析,這個函數(shù)僅僅支持IPv4,且不允許調(diào)用者指定所需地址類型的任何信息,返回的結(jié)構(gòu)只包含了用于存儲IPv4地址的空間。IPv6中引入了getaddrinfo()的新API,它是協(xié)議無關(guān)的,既可用于IPv4也可用于IPv6。getaddrinfo函數(shù)能夠處理名字到地址以及服務(wù)到端口這兩種轉(zhuǎn)換,返回的是一個addrinfo的結(jié)構(gòu)(列表)指針而不是一個地址清單。這些addrinfo結(jié)構(gòu)隨后可由套接口函數(shù)直接使用。如此以來,getaddrinfo函數(shù)把協(xié)議相關(guān)性安全隱藏在這個庫函數(shù)內(nèi)部。應(yīng)用程序只要處理由getaddrinfo函數(shù)填寫的套接口地址結(jié)構(gòu)。該函數(shù)在 POSIX規(guī)范中定義了。
1
|
?
|
/*
頭文件:
linux下#include <netdb.h>??? windows下#include<ws2tcpip.h>
原型:
int getaddrinfo( const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result );
功能:
能夠處理名字到地址以及服務(wù)到端口這兩種轉(zhuǎn)換。
參數(shù):
hostname——一個主機(jī)名或者地址串(IPv4的點(diǎn)分十進(jìn)制串或者IPv6的16進(jìn)制串);
service——十進(jìn)制的端口號,或者已定義的服務(wù)名稱如ftp、http等;
hints——可以是空指針,也可以是一個指向某個addrinfo結(jié)構(gòu)體的指針,設(shè)置該參數(shù)以獲得期望返回的信息類型;
result——本函數(shù)通過result指針返回一個指向addrinfo結(jié)構(gòu)體鏈表的指針。
返回值:
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)
{
???
/*
判斷命令行參數(shù)個數(shù)
*/
???
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));
?
???
/*
設(shè)置
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);
??? }
?
???
/*
將獲得的地址以表達(dá)格式輸出
*/
???
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
相關(guān)函數(shù):
gethostbyname
gethostbyaddr
getservbyport
getservbyname
getaddrinfo
getnameinfo
c getaddrinfo函數(shù)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元