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

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

      首先,在了解这个函数之前,我们需要知道一个结构 -- 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;
}


      运行结果如下图所示:



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值