gethostbyname()函数的说明

来源:互联网 发布:淘宝收藏 猪八戒网 编辑:程序博客网 时间:2024/05/16 17:40

最近在学习WebBench的源码,我对网络编程这一点是个小白,还带自己一点一点的学习。遇到不会的函数等就带在网上插,插这个函数的参数已经这个函数的功能。今天刚看就遇到了一个函数gethostbyname函数。通过上网插一些资料说说我对这个函数的理解,并做下笔记。

1、函数原型:struct hostent * gethostbyname(const char *hostname);

2、该函数所在的头文件为:<netdb.h> 和 <sys/socket.h>,也就是说如果想要使用这个函数必须在文件中包含这两个头文件。

3、函数的形参:函数的参数是一个const char*,是一个字符串指针。也就是我们想要访问的主机名,如"www.baidu.com"。

4、函数返回值:如果函数执行失败,返回NULL指针。

   如果函数执行成功,函数的返回值是一个指向hostent结构体的指针。下面我们来说说hostent结构体。

   4.1 hostent结构体

hostent结构体记录了与字符串hostname主机名对应的信息,hostent的原型如下

struct hostent 
{  
char *h_name;  主机名:如 www.baidu.com
char **h_aliases;  主机别名:如google
int h_addrtype;  IP地址的类型:IPV4(AF_INET)和IPV6(AF_INET6)
int h_length;  IP地址的长度
char **h_addr_list;  
#define h_addr h_addr_list[0]; h_addr是指h_addr_list中的第一地址。就是主机名对应的IP地址
};  

注意:这里千万不能用printf直接打印出h_addr,会出下错误。要使用函数inet_ntoa()打印出正确的IP

 printf("IP Address : %s\n",inet_ntoa(*((struct in_addr *)h->h_addr)));//h是hostent类型的指针 

下一篇博客中会对inet_ntoa函数进行介绍。

5、gethostbyname函数功能:将一个字符串主机名解析为一个hostent结构体。

6、linux,Ubuntu下测试代码

gethostbyname.cpp

#include<stdio.h>#include<stdlib.h>#include<netdb.h>#include<sys/socket.h>#include<arpa/inet.h>int main(int argc, char *argv[]){if(argc != 2){printf("the number of parameter is not enough!\n");exit(1);}hostent *h = gethostbyname(argv[1]);if(h == NULL){printf("error in function gethostbyname!\n");exit(1);}printf("主机名为:%s\n", h->h_name);printf("主机地址类型为:%d\n", h->h_addrtype);printf("主机地址长度为:%d\n", h->h_length);printf("主机IP为:%s\n", inet_ntoa(*((in_addr*)h->h_addr)));return 0;}
进入gethostbyname.cpp所在的文件,然后

g++ -o gethostbyname gethostbyname.cpp

./gethostbyname

7、运行结果如下:



1 0
原创粉丝点击