最近一段时间在看网络编程的东西,其中的一些函数很是好用,故留下笔记在这。
首先,在了解这个函数之前,我们需要知道一个结构 -- 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;
}
运行结果如下图所示: