最近一段时间在看网络编程的东西,其中的一些函数很是好用,故留下笔记在这。

      首先,在了解这个函数之前,我们需要知道一个结构 -- struct hostent


struct hostent {
     char *h_name;
     char **h_aliases;
     int h_addrtype;
     int h_length;
     char **h_addr_list;
     #define h_addr h_addr_list[0]
};



      第一个字段: 主机的名字

      第二个字段:   主机的别名,可能会有多个

      第三个字段:   主机的地址类型,IPV4 或 IPV6

      第四个字段:   主机地址的长度

      第五个字段:   主机的地址列表(IP地址)

      第六个字段:   这是一个宏定义,取得主机的地址列表中的第一个地址


      下面,给出一段测试程序,说明这个函数的用法:


#include <stdio.h>
#include <netdb.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>

/*
struct hostent *gethostbyname(const char *name);
struct hostent {
     char *h_name;
     char **h_aliases;
     int h_addrtype;
     int h_length;
     char **h_addr_list;
     #define h_addr h_addr_list[0]
};
*/

#define DEST		"www.google.com"

int main(int argc, char **argv, char **environ)
{
	struct hostent *host = NULL;
	char **pptr = NULL;
	char str[255];
	if ((host = gethostbyname(DEST)) == NULL)
	{
		perror("host error");
		exit(1);
	}
	printf("h_name : %s\n", host -> h_name);
	pptr = host -> h_aliases;
	for (pptr; *pptr != NULL; pptr++)
	{
		printf("h_aliases : %s\t\n", *pptr);
	}
	printf("h_length : %d\n", host -> h_length);
	
	switch(host -> h_addrtype)
	{
		case AF_INET:
		case AF_INET6:
		pptr=host -> h_addr_list;
		/* 将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数 */
		for(; *pptr != NULL; pptr++)
		printf("address:%s\n", inet_ntop(host -> h_addrtype, (void *)*pptr, str, sizeof(str)));
		break;
		default:
		printf("unknown address type\n");
		break;
	}
	return 0;
}


      运行结果如下图所示:

网络编程 -- gethostbyname() 函数解析_测试