linux下的C socket编程(2)
获取域名对应的ip地址
经过上面的讨论,如果我们要向链接远程的服务器,我们需要知道对方的ip地址,系统函数gethostbyname便能够帮助我们实现这个目的。他能够获取域名对应的ip地址并且返回一个hostent类型的结果。其中包含了ip地址信息,它的头文件是:netdb.h
1
2
3
4
5
6
7
8
|
struct hostent { char * h_name; //主机名 char **h_aliases; //别名列表 int h_addrtype; //地址类型 int h_length; //地址的长度 char **h_addr_list; //地址列表 } |
其中h_addr_list便是存放ip地址的信息。
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
|
# include <stdio.h> # include <string.h> # include <stdlib.h> # include <sys/socket.h> # include <sys/types.h> # include <netdb.h> int main() { char *hostname= "www.baiidu.com" ; char ip[ 100 ]; struct hostent *host; struct in_addr ** addr_list; int i; if (NULL==(host = gethostbyname(hostname))) { perror( "get host by name error
" ); exit( 1 ); } addr_list= (strut in_addr **)host->h_addr_list; for (i= 0 ;addr_list[ 1 ]!=NULL;i+= 1 ) { //inet_ntoa()将long类型的ip地址转化成圆点字符串形式,作用与inet_addr()相反 strcpy(ip,inet_ntoa(*addr_list[i])); } printf( "%s resolved to %s " ,hostname,ip); return 0 ; } |
gethostbuname()用来获取域名对应的ip地址,可以参加gethostbyname()来产看更多的用法。
从socket连接中获取对方ip:
由前面能够知道accept()返回的是结构体sockaddr_in,由此很容易得知对方的ip和端口信息。
1
2
|
char * client_ip = inet_ntoa(client.sin_addr); int cilent_port = ntohs(client.sin_port); |
到现在为止,我们已经解除了很多个重要类型。
1、sockaddr_in 连接信息
2、in_addr long 类型的ip地址。
3、sockaddr与sockaddr_in 类似,是通过用socket连接信息。
4、hostent 域名对应的ip信息。用在gethostbyname。