第11章 名字与地址转换

域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射。

#include <netdb.h>

const char *hstrerror(int err);  //全局h_errno被设置错误信息

struct hostent
{
char  *h_name;       //地址的正式名称
char **h_aliases;    //地址的预备名称的指针
int    h_addrtype;   //地址类型
int    h_length;     //地址的比特长度
char **h_addr_list;  //主机网络地址指针,网络字节顺序
};
struct hostent *gethostbyname(const char *hostname);
struct hostent *gethostbyname_r(const char *hostname, struct hostent *result, char *buf, int buflen/*8192*/, int *h_errnop);
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);
struct hostent *gethostbyaddr_r(const char *addr, int len, int type, struct hostent *result, char* buf, int buflen/*8192*/, int* h_errnop);

struct servent 
{
char  *s_name;     //正规的服务名
char **s_aliases;  //一个以空指针结尾的可选服务名队列
int    s_port;     //连接该服务时需要用到的端口号,返回的端口号是以网络字节顺序排列的
char  *s_proto;    //连接该服务时用到的协议名
};
struct servent* getservbyname(const char *servname, const char *protoname);
struct servent* getservbyport(int port, const char* protoname);

struct addrinfo 
{
    int ai_flags;      /*in*/
    int ai_family;     /*in*/
    int ai_socktype;   /*in*/
    int ai_protocol;   /*in*/ /*IPPROTO_TCP/IPPROTO_UDP*/
    socklen_t ai_addrlen;
    struct sockaddr *ai_addr;
    char *ai_canonname;
    struct addrinfo *ai_next;
};
int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result);
const char* gai_strerror(int error);     //getaddrinfo的返回值做参数
void freeaddrinfo(struct addrinfo* ai);  //形参是链表头
int getnameinfo(const struct sockaddr* sockaddr, socklen_t addrlen, char* host, socklen_t hostlen, char* serv, socklen_t servlen, int flags);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux驱动

第1阶段——uboot分析之启动函数bootm命令 (9)

本节主要学习: 详细分析UBOOT中"bootcmd=nand read.jffs2 0x30007FC0 kernel;bootm 0x30007FC0...

1665
来自专栏维C果糖

史上最简单的 MySQL 教程(六)「SQL 基本操作 之 数据操作」

根据操作对象的不同,咱们可以将 SQL 的基本操作分为三类,分别为:库操作、表(字段)操作和数据操作。

41413
来自专栏Java架构沉思录

如何优雅地实现Redis命令setbits与getbits

在之前的文章《如何优雅地使用Redis之位图操作》和《再谈如何优雅地使用Redis之位图操作》中,笔者介绍了关于Redis位图操作的高级应用,其中就讲到了如何优...

712
来自专栏python3

python标准库--logging模块

它们的值为0-50(也可以自定义级别),这些级别的用处是,先将自己的日志定一个级别,logging模块发出的信息级别高于定义的级别,将在标准输出(屏幕)显示出来...

641
来自专栏编程坑太多

python web开发-flask中日志的使用

1424
来自专栏性能与架构

nodejs 执行机制

nodejs接收到异步请求后,先封装好请求对象,然后交由线程处理,处理完成后把请求对象放入事件队列 nodejs有一个事件循环,每次循环时获取队列中的请求对象,...

3328
来自专栏技术小讲堂

WCF中操作的分界于调用顺序和会话的释放操作分界实例停止

操作分界 在WCF操作契约的设计中,有时会有一些调用顺序的业务,有的操作不能最先调用,有的操作必须最后调用,比如在从一个箱子里拿出一件东西的时候,必须先要执行打...

3076
来自专栏Linux驱动

第1阶段——uboot分析之启动函数bootm命令 (9)

本节主要学习: 详细分析UBOOT中"bootcmd=nand read.jffs2 0x30007FC0 kernel;bootm 0x30007FC0" 中...

1829
来自专栏用户2442861的专栏

windows下mongodb安装与使用整理

3.创建文件夹d:\mongodb\data\db、d:\mongodb\data\log,分别用来安装db和日志文件,在log文件夹下创建一个日志文件Mong...

562
来自专栏Android 研究

Android系统启动——2init进程

严格上讲,Android系统实际上是运行于Linux内核之上的一系列"服务进程",并不算一个完成意义上的"操作系统";而这一系列进程是维持Android设备正常...

852

扫描关注云+社区