函数
利用域名获取IP地址
利用gethostbyname可以通过传递字符串格式的域名获取IP地址。
#include<netdb.h>
@param hostname:目的域名
struct hostent * gethostbyname(const char * hostname);
//成功返回hostent结构体地址,失败返回NULL指针
struct hostent
{
char *h_name; //official name 官方域名
char ** h_aliases; //alias list 包含官方域名在内的对应(同一个IP地址的)同一主页的所有域名
int h_addrtype; //host address type IP地址族信息,IPv4则该变量为AF_INET
int h_length; //address length IP地址长度,IPv4:4字节 IPv6:16字节 值为4或16
char **h_addr_list; //address list (重要)通过此变量以整数形式保存域名对应IP地址。当多个IP对应同一域名时,通过此变量获取IP地址信息
}
//为什么h_addr_list使用char类型而不是int类型:
//hostent并非只为IPV4准备,h_addr_list指向数组中也可保存IPV6地址信息,考虑到通用性声明为char指针。
利用IP地址获取域名
#include<netdb.h>
@param addr: 含有IP地址信息的in_addr结构体指针。为同时传递IPv4地址以外的其他信息,声明为char
@param len: 向addr传递的地址信息的字节数,IPv4时取4,IPv6时取16
@param family: 传递地址族信息,IPv4时为AF_INET,IPv6时为AF_INET6
struct hostent * gethostbyaddr(const char * addr,socklen_t len,int family);
//成功返回hostent结构体变量地址值,失败返回NULL指针
知识点
域名系统
DNS是对IP地址和域名进行相互转换的系统,其核心是DNS服务器。
域名是什么?
提供网络服务的服务器端也是通过IP地址区分的,但几乎不可能以非常难记的IP地址替换服务器端地址信息。由此域名是赋予服务器的虚拟地址而非实际地址,
需要将虚拟地址转化为实际地址,即IP地址,这个转化的过程由DNS服务器来完成,当需要转化时,向DNS服务器请求转换地址。
注意:
一般不会轻易改变服务器域名,但会相对频繁的改变服务器IP地址
域名例:www.naver.com
IP地址例:222.122.195.5
通过ping命令可以验证IP数据报是否到达目的地,执行过程中会经过域名->IP地址的转换过程,故可通过此命令查看IP地址。
在Linux系统中输入nslookup也可以知道本机中的默认DNS服务器地址
nslookup
IP地址和域名之间的转换
程序中有必要使用域名吗?
IP地址比域名发生变化的概率更高,一旦注册域名可能永久不变,相较于使用IP地址,使用域名获取IP地址更好一点。
实例
gethostbyaddr使用有问题,可能是版本问题,我使用的是Ubuntu11.10版本,找到的Ubuntu64版本的解决方法是:
sudo apt-get install tk-dev tcl-dev build-essential libc6-dev g++-multilib ia32-libs lib32z1-dev lib32gmp3-dev
但我使用上命令后提示无法找到这些包