gethostbyname和gethostbyaddr
一、gethostbyname函数原型
#include <netdb.h>struct hostent *gethostbyname(const char *ghostname);返回:成功返回非空指针,出错为NULL且设置h_errno
二、hostent结构
struct hostent {char *h_name; /* official name of host */char **h_aliases; /* pointer to array of pointers to alias name */int h_addrtype; /* host address type: AF_INET */int h_length; /* length of address: 4 */char **h_addr_list; /* ptr to array of ptrs with IPv4 addrs */ };
三、关于全局整体变量h_errno
当gethostbyname发生错误时,它不设置errno变量,而是将全局变量h_errno设置为<netdb.h>中定义的下列常值之一:
(1)HOST_NOT_FOUND;
(2)TRY_AGAIN;
(3)NO_RECOVERY;
(4)NO_DATA(等同于NO_ADDRESS)
NO_DATA错误表示指定的名字有效,但是它没有A记录
四、gethostbyname例子
#include <stdio.h> #include <netdb.h> #include <stdlib.h> #include <sys/socket.h> #include <arpa/inet.h>#define INET_ADDRSTRLEN 16void err_ret(const char *, ...); void err_msg(const char *, ...);int main(int argc, char **argv) {char *ptr, **pptr;char str[INET_ADDRSTRLEN];struct hostent *hptr;while (--argc > 0) {ptr = *++argv;if ( (hptr = gethostbyname(ptr)) == NULL) {err_msg("gethostbyname error for host: %s: %s",ptr, hstrerror(h_errno));continue;}printf("official hostname: %s\n", hptr->h_name);for (pptr = hptr->h_aliases; *pptr != NULL; pptr++) {printf("\talias: %s\n", *pptr);}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, *pptr, str, sizeof(str)));}break;}default: {err_ret("unknown address type");break;}}}exit(0); }
#include <stdio.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> /* ANSI C header file */ #include <syslog.h> /* for syslog() */#define MAXLINE 4096int daemon_proc; /* set nonzero by daemon_init() */static void err_doit(int, int, const char *, va_list);/* Nonfatal error related to system call* Print message and return */void err_ret(const char *fmt, ...) {va_list ap; va_start(ap, fmt); err_doit(1, LOG_INFO, fmt, ap);va_end(ap);return; }/* Fatal error related to system call* Print message and terminate */void err_sys(const char *fmt, ...) {va_list ap;va_start(ap, fmt);err_doit(1, LOG_ERR, fmt, ap);va_end(ap);exit(1); }/* Fatal error related to system call* Print message, dump core, and terminate */void err_dump(const char *fmt, ...) {va_list ap;va_start(ap, fmt);err_doit(1, LOG_ERR, fmt, ap);va_end(ap);abort(); /* dump core and terminate */exit(1); /* shouldn't get here */ }/* Nonfatal error unrelated to system call* Print message and return */void err_msg(const char *fmt, ...) {va_list ap;va_start(ap, fmt);err_doit(0, LOG_INFO, fmt, ap);va_end(ap);return; }/* Fatal error unrelated to system call* Print message and terminate */void err_quit(const char *fmt, ...) {va_list ap;va_start(ap, fmt);err_doit(0, LOG_ERR, fmt, ap);va_end(ap);exit(1); }/* Print message and return to caller* Caller specifies "errnoflag" and "level" */static void err_doit(int errnoflag, int level, const char *fmt, va_list ap) {int errno_save, n;char buf[MAXLINE + 1];errno_save = errno; /* value caller might want printed */ #ifdef HAVE_VSNPRINTFvsnprintf(buf, MAXLINE, fmt, ap); /* safe */ #elsevsprintf(buf, fmt, ap); /* not safe */ #endifn = strlen(buf);if (errnoflag)snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save));strcat(buf, "\n");if (daemon_proc) {syslog(level, buf);} else {fflush(stdout); /* in case stdout and stderr are the same */fputs(buf, stderr);fflush(stderr);}return; }
五、gethostbyaddr函数原型
#include <netdb.h>struct hostent *gethostbyaddr(const struct in_addr *, socklen_t, int family);返回:成功为非空指针,否则为NULL且设置h_errno 功能:由一个二进制IP地址找到相应的主机名
转载于:https://www.cnblogs.com/soldierback/p/10740342.html
gethostbyname和gethostbyaddr相关推荐
- Linux获取本机hostname函数,Linux下获得主机与域名-gethostbyname和gethostbyaddr
1.数据结构hostent和servent: struct hostent{ char *h_name;/* official domain name of host */ char **h_alia ...
- (域名、主机名、服务名、端口号)名字与地址的转换 (gethostbyname、getservbyname、getaddrinfo、getnameinfo等)
转载地址 本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器 ...
- Linux socket 网络编程 常用头文件
一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_D ...
- UNP总结 Chapter 11 名字与地址转换
本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器名字和端口 ...
- UNP Chapter 11 - 高级名字与地址转换
11.1. 概述 函数gethostbyname和gethostbyaddr是依赖于协议的,使用前一个函数时,我们必须知道放置结果的套接口地址结构的成员是哪一种(举例来说,IPv4使用sin_addr ...
- 《UNIX环境编程》第十六章--网络IPC:套接字
Contents 套接字接口 套接字描述符 寻址 字节序 地址格式 地址查询 绑定地址 建立连接 数据传输 套接字选项 带外数据 UNIX域套接字 使用套接字的示例 面向连接的ruptime 无连接的 ...
- (转载)IP,主机名,域名
参考自 IP,主机和域名 Content 在网络通信中,每个IP可唯一表示一台主机,在多网卡或者路由器等的情况下,每个主机可以有多个IP,通过哪个IP都可以找到该主机;但是IP地址是一个32位的数字, ...
- 20145217信息安全系统设计基础第11周学习总结
一.知识点梳理 (一)异常控制流概述 控制转移:从一条指令到下一条指令的过渡. 控制流:控制转移序列. 最简单的控制流:平滑的序列,每条指令在存储器中都是相邻的. 平滑流的突变:由于跳转.调用和返回等 ...
- 网络编程学习笔记(RES_USE_INET6解析器选项)
通过这个选项来通知解析器让gethostbyname返回IPv6地址而不是IPv4地址 1.应用 程序本身可以设置此选项,首先调用解析器的res_init函数,然后打开该选项: #include &l ...
最新文章
- cameraraw面板大小调整_Camera Raw基础操作面板介绍
- Android Linux自带iptables配置IP访问规则
- HDU4259(简单群置换)
- 腾讯吃鸡 android,腾讯吃鸡手游《光荣使命》正式上线:安卓/iOS不限号测试
- input=file 浏览时只显示指定excel文件,筛选特定文件类型
- [Matlab] PDETool 的 Set Formula 的元素排列顺序会影响 Boundary 的判定
- SetTimeout(延迟计时器)
- 怎么彻底卸载cad2017_怎么彻底卸载删除cad
- python股票量化交易(4)---金叉与死叉
- win10总显示打印机未连接服务器,win10系统打印机共享提示连接失败的解决方法...
- 【调剂】2020燕山大学电气工程学院“智能信息处理”课题组研究生招生及调剂信息发布了!...
- 女生可以做软件测试吗?
- 南昌大学超级计算机,南昌大学-理学院
- 送书|逆向系列-你一定要懂的MD5加密
- 白盒测试重点复习内容
- 【今日CV 计算机视觉论文速览】 26 Mar 2019
- Java CAS操作的实现原理深度解析与应用案例
- 学习的Python的第五天
- 微信小程序 手写签名_微信小程序实现手写签字
- 2022全球「高被引科学家」榜单出炉!中国内地1169人入选,紧追美国
热门文章
- 江苏辖区农商银行2020年(科技类)
- prometheus+alertmanager+webhook实现自定义监控报警系统
- 迅捷画图中套用流程图模板编辑方法介绍
- SpringBoot 启动类 @SpringBootApplication 注解 以及执行流程
- 如何求地球上两点之间的最短距离_初中数学求线段之和最小的问题,知识点题型汇总...
- (转)腾讯区块链方案白皮书:底层技术平台及五大场景解决方案
- GWO灰狼优化算法综述(Grey Wolf Optimization)
- 蜜蜂路线图c语言思路,打蜜蜂(c语言)(Hit the bee (C language)).doc
- ext表格内容自动换行
- 语义分割中的mIoU计算函数解读