【C语言】linux网络编程—hostent结构体,gethostbyname的使用

使用gethostbyname函数获取 hostent 域名结构体

最简单的情况,这里面不包括出错处理,异常等的处理:

#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <netinet/in.h>

int main(int argc, char **argv)
{

struct hostent *host; 

printf("%d\n",argc);

char *name = *(argv+1);
host = gethostbyname(name);

printf("h_name:  %s\n",host->h_name);

hostent结构体和gethostbyname是在 netdb.h库函数中定义的。

运行结果:

[root@localhost program]# ./serverDemo www.baidu.com
2
h_name:  www.a.shifen.com

说明当输入 www.baidu.com参数的时候,输出了域名结构体对应的域名

域名结构体的完整定义为:

struct hostent
{
    char *h_name;  //主机名
    char **h_aliases;  //主机所有的别名构成的一个字符串数组
    int h_addrtype; //主机IP地址的类型 例如IPV4还是IPV6
    int h_length;  //主机ip地址长度
    char **h_addr_list;  /*  表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。
                           所以到真正需要打印出这个IP的话,需要调用inet_ntop()。*/
};

还有一点需要注意的就是main函数的参数:

main函数默认有两个参数 即 main(int argc, char **argv)

argc表示的是所要运行的程序的参数的个数,argv指的是参数的值,是用一个字符串数组来表示的。

默认情况下,可执行程序会传入一个参数那就是 可执行程序的名称 ,比如我的上面的例子,默认的参数就是argv指向的值为serverDemo,  因此argc的值为1.

当输入./ serverDemo www.baidu.com的时候,参数就变成了两个: 一个是 程序名,另一个是 www.baidu.com,  此时argc自动编程了2。

获取第一个参数的方法是: *argv   获取第二个参数的方法是 *(argv+1);

如果不小心将main的第一个参数也就是函数名传入 gethostbyname的时候就会出现错误, segment fault




你可能感兴趣的:(【C语言】linux网络编程—hostent结构体,gethostbyname的使用)