IP地址比域名发生变更的概率更高,一旦注册域名可能永久不变,因此利用域名编写程序会好一些。这样,每次运行程序时根据域名获取ip地址,再接入服务器,这样程序就不会依赖于服务器ip地址了。
程序示例
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<netdb.h>
void error_handling(char *message);
int main(int argc,char *argv[])
{
//保存hostent结构体地址
struct hostent *host;
if(argc!=2)
{
printf("Usage: %s <addr>\n",argv[0]);
exit(1);
}
printf("%s\n",argv[1]);
//域名解析
host=gethostbyname(argv[1]);
if(!host)
error_handling("gethost... error");
//官方域名
printf("Official name: %s \n",host->h_name);
//输出除官方域名以外的域名
for(int i=0;host->h_aliases[i];i++)
printf("Aliases %d: %s \n",i+1,host->h_aliases[i]);
//输出地址族信息
printf("Address type: %s \n",(host->h_addrtype==AF_INET)?"AF_INET":"AF_INET6");
//输出该域名绑定的其他ip地址
for(int i=0;host->h_addr_list[i];i++)
printf("IP addr %d: %s \n",i+1,inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
return 0;
}
void error_handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}
运行结果
还可以利用gethostbyaddr函数利用ip地址获取域相关信息
程序示例
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<netdb.h>
void error_handling(char *message);
int main(int argc,char *argv[])
{
//保存hostent结构体地址
struct hostent *host;
struct sockaddr_in addr;
if(argc!=2)
{
printf("Usage: %s <addr>\n",argv[0]);
exit(1);
}
printf("%s\n",argv[1]);
memset(&addr,0,sizeof(addr));
addr.sin_addr.s_addr=inet_addr(argv[1]);
host=gethostbyaddr((char *)&addr.sin_addr,4,AF_INET);
if(!host)
error_handling("gethost... error");
//官方域名
printf("Official name: %s \n",host->h_name);
//输出除官方域名以外的域名
for(int i=0;host->h_aliases[i];i++)
printf("Aliases %d: %s \n",i+1,host->h_aliases[i]);
//输出地址族信息
printf("Address type: %s \n",(host->h_addrtype==AF_INET)?"AF_INET":"AF_INET6");
//输出该域名绑定的其他ip地址
for(int i=0;host->h_addr_list[i];i++)
printf("IP addr %d: %s \n",i+1,inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
return 0;
}
void error_handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit(1);
}