一、 利用域名获取IP地址
使用下列函数可以通过传递字符串格式的域名获取IP地址
#include<netdb.h>
struct hostent * gethostbyname(const char * hostname)
:成功时返回hostent结构体地址,失败返回NULL指针
hostent结构体介绍:返回的地址信息装入hostent结构体,此结构体定义如下:
struct hostent
{
char * h_name;
char ** h_aliases;
int h_addrtype;
int h_length;
char ** h_addr_list;
}
-h_name
官方域名
- h_aliases
同一个IP可能绑定多个域名,所以除了官方域名之外还可以指定其他的域名。这些信息可以通过h_aliases获得。
- h_addrtype
判断是IPv4还是IPv6
- h_length
保存IP地址长度,IPv4(4字节)的时候为4;IPv6(16字节)的时候为16。
- h_addr_list
域名转IP时只需关注h_addr_list;这是最重要的成员,通过此变量以整数形式保存域名对应的IP地址。
测试代码:
#include<iostream>
#include<unistd.h>
#include<arpa/inet.h>
#include<netdb.h>
using namespace std;
int main(int argc,char *argv[])
{
int i;
struct hostent *host;
if(argc != 2)
{
cout<<"Usage <addr>"<<argv[0]<<endl;
exit(1);
}
host = gethostbyname(argv[1]);
cout<<"Official name"<<host->h_name<<endl;
for(int i=0;host->h_aliases[i];i++)
cout<<"Alignas:"<<i+1<<host->h_aliases[i]<<endl;
cout<<"Adress type:"<<endl;
for(int i=0;host->h_addr_list[i];i++)
cout<<"IP addr:"<<i+1<<inet_ntoa(*(struct in_addr*)host->h_addr_list[i])<<endl;
return 0;
}
执行结果:
二、利用IP获取域名
gethostbyaddr()函数:
#include<netdb.h>
struct hostent * gethostbyaddr(const char * addr,socklen_t len,int family);
- addr : 含有IP地址信息的in_addr结构体指针
- len : 行第一参数传递地址信息的字节数,IPv4为4,IPv6为16
- family: 传递地址族信息,IPv4为AF_INET,IPv6为AF_INET6
此函数返回的地址信息也在hostent结构体中,按照前面的方法读取即可;