基本名字与地址转换
DNS中的资源记录RR resource record
A
AAAA
PTR
MX
CNAME
名字和数值地址间的转换:gethostbyname() gethostbyaddr()
服务名字和端口号之间的转换: getservbyname() getservbyport()
解析器代码读 依赖于 配置文件,文件/etc/resolv.conf一般包含本地名字服务器IP地址。
DNS替代方法:静态主机文件,/etc/hosts或者网络信息系统NIS。
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];
执行一个对A记录或者AAAA记录的查询
struct hostent * gethostbyname(const char * hostname);
h_errno的常值:
HOST_NOT_FOUND
TRY_AGAIN
NO_RECOVERY
NO_DATA
使用方法:
int main(int argc,char ** argv){ char *ptr,**pptr; char str[INET6_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; } }//给每个命令行参数调用gethostbyname() printf("official hostname:%s\n",hptr->h_name); //规范主机名输出 for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++) printf("\tallias:%s\n",*pptr); switch(hptr->h_addrtype){ case AF_INET: #ifdef AF_INET6 case AF_INET6: #endif pptr = hptr->h_addr_list; for( ;*pptr != NULL;pptr++) //pptr只想一个指针数组,数组中每个指针都指向一个地址。 printf("\taddress:%s\n", inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str))); break; default: err_ret("unknown address type"); break; } exit(0); }
gethostbyaddr()函数
取一个二进制的IP地址并找到对应于这个地址的主机名。
struct hostent * gethostbyaddr(const char *addr,size_t len,int family);
addr是一个真正指向含有IPV4或者IPV6地址结构的指针
uname()返回当前主机名字
int uname(struct utsname * name);
通过调用uname得到主机名字,然后调用gethostbyname得到所有IP地址
char ** my_addrs(int * addrtype){ struct hostent *hptr; struct utsname myname; if(uname(&myname) < 0) return(NULL); if((hptr = gethostbyname(myname.nodename)) == NULL) return(NULL); *addrtype = hptr->haddrtype; return(hptr->h_addr_list); }
gethostname函数
返回当前主机名字
int gethostname(char *name,size_t namelen);
name指向主机名存储位置的指针
namelen数组的大小
主机与端口号的映射包含在一个文件中 /etc/services
struct servent * getservbyname(const char * servname,const char * protoname); struct servent{ char * s_name; char * * s_aliases; int s_port; char * s_proto; };
调用方法:
struct servent * sptr; sptr = getservbyname("ftp","tcp"); sptr = getservbyname("ftp","udp"); //因为ftp仅支持TCP,因此会失败
getservbyport()给定端口号和可选协议,查找相应的服务
struct servent * getservbyport(int port,const char * protname);//port必须为网络字节序
因此调用方法:
struct servent * sptr; sptr = getservbyport(htons(53),"udp");
信息 数据文件 结构 键值搜索函数
主机 /etc/hosts hostent gethostbyaddr,gethostbyname
网络 /etc/networks netent getnetbyaddr,getnetbyname
协议 /etc/protocols protoent getprotobyname,getprotobynumber
服务 /etc/services servent getservbyname,getservbyport
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2013-01-22 Oracle二三事之 12c 可插拔数据库PDB
2013-01-22 Oracle二三事之 Oracle SPARC SuperCluster的九大技术优势