gethostbyname() 函数说明

转载:http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881611.html

gethostbyname()函数说明——用域名或主机名获取IP地址

    包含头文件
    #include <netdb.h>
    #include <sys/socket.h>

    函数原型
    struct hostent *gethostbyname(const char *name);
    这个函数的传入值是域名或者主机名,例如"www.google.cn"等等。传出值,是一个hostent的结构。如果函数调用失败,将返回NULL。

    返回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]
    };

    hostent->h_name
    表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。
    
    hostent->h_aliases
    表示的是主机的别名.www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。

    hostent->h_addrtype    
    表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是pv6(AF_INET6)

    hostent->h_length      
    表示的是主机ip地址的长度

    hostent->h_addr_lisst
    表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。

    const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
    这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。返回指向dst的一个指针。如果函数调用错误,返回值是NULL。

复制代码
 1 #include <netdb.h>
 2 #include <sys/socket.h>
 3 #include <stdio.h>
 4 
 5 int main(int argc, char **argv)
 6 {
 7     char   *ptr, **pptr;
 8     struct hostent *hptr;
 9     char   str[32];
10     ptr = argv[1];
11 
12     if((hptr = gethostbyname(ptr)) == NULL)
13     {
14         printf(" gethostbyname error for host:%s\n", ptr);
15         return 0;
16     }
17 
18     printf("official hostname:%s\n",hptr->h_name);
19     for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)
20         printf(" alias:%s\n",*pptr);
21 
22     switch(hptr->h_addrtype)
23     {
24         case AF_INET:
25         case AF_INET6:
26             pptr=hptr->h_addr_list;
27             for(; *pptr!=NULL; pptr++)
28                 printf(" address:%s\n",
29                        inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
30             printf(" first address: %s\n",
31                        inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str)));
32         break;
33         default:
34             printf("unknown address type\n");
35         break;
36     }
37 
38     return 0;
39 }
复制代码

编译运行
-----------------------------
# gcc test.c
# ./a.out www.baidu.com
official hostname:www.a.shifen.com
alias:www.baidu.com
address:121.14.88.11
address:121.14.89.11
first address: 121.14.88.11

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux网络编程(三)select、poll和epoll

linux网络编程&#xff08;三&#xff09;select、poll和epoll一、为什么会有多路I/O转接服务器&#xff1f;二、select三、poll三、epoll一、为什么会有多路I/O转接服务器&#xff1f; 为什么会有多路I/O转接服务器呢&#xff1f;在学这个之前&#xff0c;我们同使用的是多线…

Linux socket编程(一) 对套接字操作的封装

转载:http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 以前写的&#xff0c;现在回顾一下&#xff1a; 下面是对socket操作的封装&#xff0c;因为在Linux下写中文到了windows里面会乱码&#xff0c;所以注释用英文来写&#xff0c;有空再查下解决方法吧 socket.…

数据结构(二)栈

栈一、栈顺序栈线性栈(不带头结点)线性栈(带头结点)共享栈一、栈 栈是只允许在一端进行插入或删除操作的线性表。 栈顶&#xff1a;线性表允许进行插入删除的那一端 栈底&#xff1a;固定的&#xff0c;不允许进行插入和删除的那一端 空栈&#xff1a;不含如何元素的空表 顺序…

如何在linux上安装sqlite数据库

如何在linux上安装sqlite数据库一、下载二、解压三、配置&#xff08;configure&#xff09;四、编译和安装五、执行sqlite3程序六、测试代码一、下载 首先要先下载sqlite3源码包 链接&#xff1a;https://pan.baidu.com/s/1_70342ZLlPjLlqGzpy5IHw 提取码&#xff1a;84ne …

数据结构(三)队列

数据结构&#xff08;三&#xff09;队列队列队列&#xff08;顺序存储&#xff09;循环队列&#xff08;顺序存储&#xff09;队列&#xff08;链式存储&#xff09;队列 队列是一种受限制的线性表&#xff0c;只允许表的一端插入&#xff0c;在表的另一端删除 队列&#xf…

Linux fcntl函数详解

转载&#xff1a;http://www.cnblogs.com/xuyh/p/3273082.html 功能描述&#xff1a;根据文件描述词来操作文件的特性。 文件控制函数 fcntl -- file control 头文件&#xff1a; #include <unistd.h> #include <fcntl.h> 函数原型&#xff1a; …

vs2019使用sqlite数据库远程连接linux

vs2019使用sqlite数据库远程连接linux一、sqlite3添加到目录二、添加依赖库三、测试一、sqlite3添加到目录 将两个sqlite3头文件放入目录中 二、添加依赖库 打开项目属性 添加完成 三、测试 #include <stdio.h> #include <sqlite3.h>int main(int argc, cha…

linux网络编程(四)线程池

linux网络编程&#xff08;四&#xff09;线程池为什么会有线程池&#xff1f;实现简单的线程池为什么会有线程池&#xff1f; 大多数的服务器可能都有这样一种情况&#xff0c;就是会在单位时间内接收到大量客户端请求&#xff0c;我们可以采取接受到客户端请求创建一个线程的…

AIGC:大语言模型LLM的幻觉问题

引言 在使用ChatGPT或者其他大模型时&#xff0c;我们经常会遇到模型答非所问、知识错误、甚至自相矛盾的问题。 虽然大语言模型&#xff08;LLMs&#xff09;在各种下游任务中展示出了卓越的能力&#xff0c;在多个领域有广泛应用&#xff0c;但存在着幻觉的问题&#xff1a…

关于C++子类父类成员函数的覆盖和隐藏

转载&#xff1a;http://blog.csdn.net/worldmakewayfordream/article/details/46827161 函数的覆盖 覆盖发生的条件&#xff1a; &#xff08;1&#xff09; 基类必须是虚函数&#xff08;使用virtual 关键字来进行声明&#xff09; &#xff08;2&#xff09;发生覆盖的两个函…

数据结构(四)串的顺序存储

#include <stdio.h> #include <stdlib.h>#define MAXLEN 255 //定长顺序存储 typedef struct {char ch[MAXLEN]; //每个分量存储一个字符int length; //串的实际长度 }SString;//串的初始化 bool StrAssign(SString& T, char* chars) {int i 0, len;char* …

数据结构(四)串的动态数组存储

#include <stdio.h> #include <stdlib.h>#define MAXLEN 255 //定长顺序存储 typedef struct {char* ch; //每个分量存储一个字符int length; //串的实际长度 }SString;//串的初始化 bool StrAssign(SString& T, char* chars) {int i 0, len;T.ch (char*)m…

C++名字隐藏

转载&#xff1a;http://www.weixueyuan.net/view/6361.html 如果派生类中新增一个成员变量&#xff0c;该成员变量与基类中的成员变量同名&#xff0c;则新增的成员变量就会遮蔽从基类中继承过来的成员变量。同理&#xff0c;如果派生类中新增的成员函数与基类中的成员函数同…

c语言深入浅出(一)strcpy和memcpy的区别

c语言深入浅出&#xff08;一&#xff09;strcpy和memcpy的区别strcpy和memcpy都是c语言的库函数 strcpy:只用于字符串的复制&#xff0c;当碰到‘\0’就停止了 memcpy:用于这个内存的拷贝&#xff0c;适用于结构体、字符数组、类等 char * strcpy(char * dest, const char * s…

C++ dynamic_cast操作符

转载&#xff1a;http://www.weixueyuan.net/view/6377.html 在C中&#xff0c;编译期的类型转换有可能会在运行时出现错误&#xff0c;特别是涉及到类对象的指针或引用操作时&#xff0c;更容易产生错误。Dynamic_cast操作符则可以在运行期对可能产生问题的类型转换进行测试。…

数据结构(五)树

数据结构&#xff08;五&#xff09;树一、基本操作树是n个节点的有限集&#xff0c;它是一种递归的数据结构 一、基本操作 #include <stdio.h> #include <stdlib.h> #include <iostream>#define Elemtype charusing namespace std; typedef struct BiTNod…

C++ typeid操作符

转载&#xff1a;http://www.weixueyuan.net/view/6378.html typeid操作符用于判断表达式的类型&#xff0c;注意它和sizeof一样是一个操作符而不是函数。如果需要使用typeid操作符&#xff0c;最好加上typeinfo头文件。 给出以下定义 int a;double b;char * c;long d; 下表列…

数据结构(五)层次遍历

数据结构&#xff08;五&#xff09;层次遍历// linear_listqueue.cpp : This file contains the main function. Program execution begins and ends there. //#include <iostream> #include <stdlib.h> #include <stdio.h> #define ElemType BiTree using …

C++成员函数指针的应用

转载&#xff1a;http://www.cppblog.com/colys/archive/2009/08/18/25785.html C中&#xff0c;成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中&#xff0c;每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中…

cv2.VideoCapture()无法打开视频解决方法

cv2.VideoCapture无法打开视频解决方法问题解决方法问题 cv2.VideoCapture打开mp4文件&#xff0c;直接报错 解决方法 我们打开D:\opencv_3.4.2_Qt\opencv_3.4.2_Qt\x86\bin\&#xff08;opencv的dll动态库中找到&#xff09; 找到opencv_ffmpeg342.dll文件&#xff0c;放入…