程序源于linux程序设计这本书,个人利用这本书学习,本文作为一个知识点来学习.
这里首先介绍几个结构体:
|
其中,主机地址类型h_addrtype为AF_INET;地址列表为字符串,长度不定.
|
下面来点干活,直接插入代码:
1 #include<unistd.h>
2 #include<netinet/in.h>
3 #include<arpa/inet.h>
4 #include<netdb.h>
5 #include<stdio.h>
6
7
int
main(
int
argc,
char
*argv[]){
8
char
*host, **names,**addrs;
9
struct
hostent *hostinfo;
10
11
if
(argc==1){
//若没有主机名陈,则获取本机信息
12
char
myname[256];
13 gethostname(myname,255);
14 host = myname;
15 }
16
else
17 host = argv[1];
18
19 hostinfo = gethostbyname(host);//获取主机信息
20
if
(!hostinfo){
21
fprintf
(stderr,
"cannot get info host:%s
"
,host);
22
exit
(1);
23 }
24
25
printf
(
"resluts for host %s:
"
,host);
26
printf
(
"Name:%s
"
,hostinfo -> h_name);
//主机名
27
printf
(
"Aliases:"
);
28 names = hostinfo -> h_aliases; //主机别名
29
while
(*names){//输出全部主机别名
30
printf
(
" %s"
,*names);
31 names++;
32 }
33
34
printf
(
"
"
);
35
36
if
(hostinfo -> h_addrtype !=AF_INET){//主机地址类型判断
37
fprintf
(stderr,
"not an IP host!
"
);
38
exit
(1);
39 }
40
41 addrs = hostinfo -> h_addr_list;
42
while
(*addrs){//转换主机地址格式
43
printf
(
" %s"
,inet_ntoa(*(
struct
in_addr *)*addrs));
44 addrs++;
45 }
46
printf
(
"
"
);
47
exit
(0);
48 }
程序运行结果: linux下相册不好传图片,这里直接传文字了。
./getname resluts for host farbeyond-Aspire-4741:
Name:farbeyond-Aspire-4741
Aliases: 127.0.1.1
./getname baidu.com resluts for host baidu.com:
Name:baidu.com
Aliases:
220.181.57.217 220.181.57.216 123.125.114.144
上面这三个ip地址,大家均可以用于访问百度。而谷歌同时有十几个ip在使用,依据公司规模不同而不同。
这是客户端来查询服务器端,当然服务器端也可以查看访问者的来源ip,这就提供了收集用户信息的手段。