linux下的socket编程,2--获取对方的ip地址

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;//别名列表

inth_addrtype;//地址类型

inth_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>

intmain()

{

char *hostname="www.baiidu.com";

char ip[100];

struct hostent *host;

struct in_addr ** addr_list;

inti;

if(NULL==(host = gethostbyname(hostname)))

{

perror("get host by name error\n");

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);

return0;

}

gethostbuname()用来获取域名对应的ip地址,可以参加gethostbyname()来产看更多的用法。

从socket连接中获取对方ip:

由前面能够知道accept()返回的是结构体sockaddr_in,由此很容易得知对方的ip和端口信息。

1

2

char * client_ip = inet_ntoa(client.sin_addr);

intcilent_port = ntohs(client.sin_port);

到现在为止,我们已经解除了很多个重要类型。

1、sockaddr_in 连接信息

2、in_addr long 类型的ip地址。

3、sockaddr与sockaddr_in 类似,是通过用socket连接信息。

4、hostent 域名对应的ip信息。用在gethostbyname。