转自:http://www.linuxidc.com/Linux/2012-07/65694p3.htm
网络主机名和IP地址的对应关系
在做网络编程时经常要碰到的一个问题就是根据对方主机名来获取其IP地址,或者根据IP地址反过来解析主机名和其他信息。Linux提供了两个常用的API:struct hostent *gethostbyname(const char *name);
struct hostent *gethostbyaddr(const void *addr, int len, int type);
这两个函数失败时返回NULL且设置h_errno错误变量,调用hstrerror(h_errno)或者herror("Error");可以得到详细的出错信息。成功时均返回如下结构:
struct hostent {
char *h_name; /* 主机名*/char **h_aliases; /* 主机别名的列表*/
int h_addrtype; /* 地址类型,AF_INET或其他*/
int h_length; /* 所占的字节数,IPv4地址都是4字节 */
char **h_addr_list; /* IP地址列表,网络字节序*/
}
#define h_addr h_addr_list[0] /*后向兼容 */
继续看例子:
#include <stdio.h>
#include <netdb.h>
#include <error.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int arg,char** argv)
{
struct hostent *host,*host2;if(NULL == (host = gethostbyname(argv[1]))){
herror("Error");
return 1;
}
printf("name = %s\n",host->h_name);
printf("aliases = %s\n",*host->h_aliases);
printf("add type = %d\n",host->h_addrtype);
printf("len = %d\n",host->h_length);
printf("IP=%s\n",inet_ntoa(*(struct in_addr*)host->h_addr));
printf("=================================\n");
struct in_addr maddr;
if(0 == inet_aton(argv[2],&maddr))
{
return 0;}
char* c = (char*)&maddr;
printf("org = %x.%x.%x.%x\n",*(c)&0xff,*(c+1)&0xff,*(c+2)&0xff,*(c+3)&0xff);
if(NULL == (host2 = gethostbyaddr(&maddr,4,2))){
printf("Error:%s\n",hstrerror(h_errno));
return 1;
}
printf("name = %s\n",host2->h_name);
printf("aliases = %s\n",*host2->h_aliases);
printf("add type = %d\n",host2->h_addrtype);
printf("len = %d\n",host2->h_length);
printf("IP=%s\n",inet_ntoa(*(struct in_addr*)host2->h_addr));
return 0;
}
当我们调用gethostbyaddr根据CU主页的IP地址获取其站点信息时返回的错误是“未知的主机”错误,原因留给大家自己思考吧。
这充分说明对了于gethostbyname()函数和gethostbyaddr()函数的调用一定要判断其返回值。
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2012-07/65694p3.htm
博主:不过当我根据原来博客的主人那样测试 ping www.chinaunix.net 得到的ip,作为一个参数传递的时候,出错信息是:
不明白,具体原因是什么???