socket编程:利用域名获取ip地址

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值