gethostbyname()函数详解

2023-11-13


基本概念:

gethostbyname()函数主要作用:用域名或者主机名获取地址,操作系统提供的库函数。以下的讨论基于linux环境


域名系统(Domain Name System, DNS)主要用于主机名字与IP地址之间的映射。每个组织机构往往运行一个或多个名字服务器(name server),我们编写的客户端和服务器等应用程序通过调用解析器(resolver)的函数库中的函数接触DNS服务器。常见的解析器函数是gethostbyname和gethostbyaddr,图11-1展示了应用进程、解析器和名字服务器之间的一个典型关系。



函数原型:

GETHOSTBYNAME(3)           Linux Programmer's Manual          GETHOSTBYNAME(3)

NAME
       gethostbyname,   gethostbyaddr,   sethostent,  gethostent,  endhostent,
       h_errno, herror, hstrerror, gethostbyaddr_r, gethostbyname2, gethostby‐
       name2_r, gethostbyname_r, gethostent_r - get network host entry

SYNOPSIS
       #include <netdb.h>
       extern int h_errno;

       struct hostent *gethostbyname(const char *name);

       #include <sys/socket.h>       /* for AF_INET */

       const char *hstrerror(int err);

返回值:

失败返回NULL指针


成功返回的非空指针指向如下的hostent结构:

struct hostent {
      char  *h_name;            /* official name of host */
      char **h_aliases;         /* alias list */
      int    h_addrtype;        /* host address type */
      int    h_length;          /* length of address */
      char **h_addr_list;       /* list of addresses */
}

hostent->h_name
表示的是主机的规范名。例如www.baidu.com的规范名其实是www.a.shifen.com。
    
hostent->h_aliases
表示的是主机的别名。www.baidu.com就是baidu他自己的别名。

hostent->h_addrtype    
表示的是主机ip地址的类型。只会是ipv4(AF_INET), 这个函数处理不了ipv6

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

hostent->h_addr_list
表示的是主机的ip地址。是网络字节序,需要通过inet_ntop函数转换。


测试代码 gethostbyname.cpp:

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>

extern int h_errno;

int main(int argc, char **argv)
{
    if (argc != 2) {
        printf("Use example: %s www.google.com\n", *argv);
        return -1;
    }

    char *name = argv[1];
    struct hostent *hptr;

    hptr = gethostbyname(name);
    if (hptr == NULL) {
        printf("gethostbyname error for host: %s: %s\n", name, hstrerror(h_errno));
        return -1;
    }
    //输出主机的规范名
    printf("\tofficial: %s\n", hptr->h_name);

    //输出主机的别名
    char **pptr;
    char str[INET_ADDRSTRLEN];
    for (pptr=hptr->h_aliases; *pptr!=NULL; pptr++) {
        printf("\ttalias: %s\n", *pptr);
    }

    //输出ip地址
    switch (hptr->h_addrtype) {
        case AF_INET:
            pptr = hptr->h_addr_list;
            for (; *pptr!=NULL; pptr++) {
                printf("\taddress: %s\n",
                        inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str)));
            }
            break;
        default:
            printf("unknown address type\n");
            break;
    }

    return 0;
}


编译:

g++ gethostbyname.cpp


运行:



与nslookup对比:



ps: gethostname可能存在性能瓶颈问题,请参考文章:http://blog.csdn.net/shijun_zhang/article/details/6577426


参考:《unix网络编程》·卷1



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gethostbyname()函数详解 的相关文章

  • 编译器 libstdc++ 版本与系统版本

    我试图了解 g 如何选择它链接的 libstdc 版本 以及当库的 系统 版本不同时它意味着什么 我正在使用 gcc g 4 1 2 根据ABI 指南 http gcc gnu org onlinedocs libstdc manual a
  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • :: 右侧的非法标记

    我有以下模板声明 template
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 干净地销毁System V共享内存段

    我在用shmget shmat and shmctl分别获取和创建共享内存段 将其附加到进程地址空间中并删除它 我想知道进程是否仍然可以使用共享内存段 即使它已被分离并要求使用删除 shmctl id IPC RMID 在一个过程中 我无法
  • 使用 linux perf 工具测量应用程序的 FLOP

    我想使用 perf Linux 性能计数器子系统的新命令行接口命令 来测量某些应用程序执行的浮点和算术运算的数量 出于测试目的 我使用了我创建的一个简单的虚拟应用程序 请参见下文 因为我找不到任何为测量 FP 和整数运算而定义的 perf
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • Mono 和 WebRequest 速度 - 测试

    在 mono 4 6 2 linux 中 我注意到 wget 下载文件的速度与webclient DownloadString 所以我做了一个小测试来调查 为什么 wget 明显比 C 快 根据我自己的实验 使用 wget 下载 手动读取文
  • jpackage linux 创建的桌面文件不足

    我刚刚开始使用 jpackage 它是一个非常棒的工具 只要迈出一步 我的肩上的工作就减轻了很多 我对看起来硬编码且无法定制的东西越感到惊讶 JPackage 自动生成启动器 lib
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • 如何使用libaudit?

    我试图了解如何使用 libaudit 我想接收有关使用 C C 的用户操作的事件 我不明白如何设置规则 以及如何获取有关用户操作的信息 例如 我想获取用户创建目录时的信息 int audit fd audit open struct aud
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西
  • gnome-terminal 新选项卡,使用别名作为要执行的命令

    我已经创建了一个别名 bashrc文件如下 alias myproject cd Desktop myproject 当我重新启动终端时保存文件后 输入myproject带我到项目目录 但是当我尝试使用别名作为新的命令参数时gnome te
  • gdb 错误 - 文件不是可执行格式:无法识别文件格式

    我正在尝试使用 gdb 调试某个名为 xdf 的程序 但是当我运行 gdb xdf 时 出现以下错误 home nealtitusthomas X ray astronomy heasoft 6 24 x86 64 pc linux gnu
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手

随机推荐

  • JDBC连接

    JDBC连接 加载JDBC驱动程序 打开JDBC连接 打开带有URL的连接 使用URL 用户和密码打开连接 使用URL和属性打开连接 关闭JDBC连接 通过Try With Resources关闭连接 setAutoCommit commi
  • 在机器学习中,你需要多少训练数据?

    你为什么会问这个问题 首先我们要搞清楚你为什么会问需要多大的训练数据集 可能你现在有以下情况 你有太多的数据 可以考虑通过构建学习曲线 learning curves 来预估样本数据集 representative sample 的大小或者
  • 焊缝识别技术研究

    一 绪论 提高焊接效率和保证焊接质量是焊接产业行业的重要发展方向 示教 在线 的编程模式需要占用大量的编程时间 效率低下 同时 示教的精度难以保证 可重复性差 难以适用于复杂的机器人作业 离线编程软件有RobotMaster RobotSt
  • JS判断对象、数组是否包含某个属性、某个值

    一 判断对象是否包含某个属性 可以使用以下几种方法来判断对象是否包含某个属性 1 in 操作符 使用 in 操作符可以检查对象是否包含指定的属性 它会检查对象及其原型链上的所有属性 const obj name John age 25 co
  • 2023智源大会议程公开丨视觉与多模态大模型论坛

    6月9日 2023北京智源大会 将邀请AI领域的探索者 实践者 以及关心智能科学的每个人 共同拉开未来舞台的帷幕 你准备好了吗 与会知名嘉宾包括 图灵奖得主Yann LeCun OpenAI创始人Sam Altman 图灵奖得主Geoffr
  • 第十六篇:关于Unity开发WebGL遇到的坑

    1 资源消耗问题 Unity开发Web 项目 发布出来的项目是很消耗内存资源的 这是Unity引擎决定 我们要做的就是尽可能的优化 通常的方法有降低模型面数 降低贴图的大小 减少点光源 减小烘焙贴图大小等 当然也可以使用three js开发
  • 机器人流程自动化(RPA):6大开源工具

    51CTO com快译 与实施许多新软件一样 开始使用机器人流程自动化 RPA 方面面临自建还是外购的选择 如果是自建 只要你有合适的人员 预算到位 可以从头开始编写自己的机器人 如果是外购 有一个新兴的商业软件供应商市场 它们提供各式各样
  • 数据链路层--以太网协议

    目录 以太网协议 认识以太网 以太网帧格式 认识MAC地址 认识MTU 数据跨网络传输的过程 ARP协议 ARP概念 ARP数据的格式 ARP协议的工作流程 ARP请求的过程 ARP应答的过程 ARP缓存表 在学习完ip协议后知道 网络层解
  • 大话设计模式学习 C++

    工厂模式 include bits stdc h using namespace std 基类 进行操作 class Operation protected data double numberA 0 double numberB 0 pu
  • SSM项目可以正常启动并访问,控制台无报错,但是项目调用controller层返回404

  • 18650锂电池保护板接线图_锂电池保护板几种接线方法介绍 - 全文

    锂电池保护板简介 锂电池保护板是对串联锂电池组的充放电保护 在充满电时能保证各单体电池之间的电压差异小于设定值 一般 20mV 实现电池组各单体电池的均充 有效地改善了串联充电方式下的充电效果 同时检测电池组中各个单体电池的过压 欠压 过流
  • Linux C++ 遍历子目录下的文件名称并保存到变量vector<string> 中

    遍历子目录下的文件名称并保存到变量vector 中 include
  • Java设计模式-原型模式

    原型模式 在有些系统中 存在大量相同或相似对象的创建问题 如果用传统的构造函数来创建对象 会比较复杂且耗时耗资源 用原型模式生成对象就很高效 原型模式的定义与特点 原型 Prototype 模式的定义如下 用一个已经创建的实例作为原型 通过
  • 华为鸿蒙os什么时候发布,华为鸿蒙OS发布,支持上百款机型(附推送名单),你会升级吗?...

    昨天晚上 万众期待的华为鸿蒙OS正式发布 对于国产操作系统具有跨时代的意义 首批支持上百款机型升级 意味着鸿蒙OS诞生之初便形成Android iOS 鸿蒙OS鼎足而立之势 鸿蒙OS并非拷贝Android和iOS系统 尤其Android特性
  • Java并发编程原理与实战课程(叶子猿)

    前4节官网免费看 txt 05线程的状态以及各状态之间的转换详解 mp4 06线程的初始化 中断以及其源码讲解 mp4 07多种创建线程的方式案例演示 一 带返回值的方式 mp4 08多种创建线程的方式案例演示 二 使用线程池 mp4 09
  • Java设计模式——桥接模式

    文章目录 桥接模式 桥接模式 桥接模式就是把事物和其具体实现分开 使他们可以各自独立的变化 桥接的用意是 将抽象化与实现化解耦 使得二者可以独立变化 像我们常用的JDBC桥DriverManager一样 JDBC进行连接数据库的时候 在各个
  • 华为FusionCompute之个人学习环境虚拟化嵌套部署方案

    华为FusionCompute之个人学习环境虚拟化嵌套部署方案 一 环境介绍 1 本次实践背景 2 物理机配置介绍 3 FC虚拟化部署方案介绍 4 虚拟化环境介绍 5 本次实践目的 二 检查本地环境 1 检查虚拟化环境 2 FC部署进度介绍
  • 软考-系统架构师-计算机与网络基础知识-系统性能

    文章目录 1 性能指标 2 性能计算 3 性能设计 4 性能评估 说明 系统性能是一个系统提供给用户的中国性能指标的集合 它包括硬件性能 软件性能 部件性能指标 综合性能指标 1 性能指标 性能指标是软 硬件的性能指标的集成 在硬件中包括计
  • EMC测试的那些项目,你都知道么?

    转载 EMC电磁兼容 2022 03 27 08 30 EMC检测 电磁兼容性检测 的全称是Electro Magnetic Compatibility 其定义为 设备和系统在其电磁环境中能正常工作且不对环境中任何事物构成不能承受的电磁骚扰
  • gethostbyname()函数详解

    基本概念 gethostbyname 函数主要作用 用域名或者主机名获取地址 操作系统提供的库函数 以下的讨论基于linux环境 域名系统 Domain Name System DNS 主要用于主机名字与IP地址之间的映射 每个组织机构往往