- 1、本文档共19页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 关于名称和地址族 目标 掌握DNS的基本概念 掌握编写通用的名字地址的TCP程序 掌握通过名字获取本机IP的方法。 将名字映射到数字(1) 利用点或冒号分隔的数字串标识端点对用户不是非常友好 主机的Internet地址被绑定到它连接到的网络的某个部分。如果主机移到另一个网络或者改变Internet服务提供商(ISP),它的Internet地址一般不得不改变。 事实上我们更容易记住像这样的名字。 将名字映射到数字(2) Sockets API的大多数实现允许访问把名称映射到其他信息(包括Internet地址)的名称服务。 名称服务并不是使TCP/IP工作所必须的。 主机命名服务的两个主要来源是DNS(Domain Name System)和本地配置数据库。 DNS DNS是一种分布式数据库,用于把像这样的域名映射到Internet地址以及其他信息 DNS协议允许连接到Internet的主机使用TCP或UDP从该数据库中检索信息。 本地配置数据库一般是用于名称-Internet地址映射的特定于操作系统的机制。 对程序员来说,名称服务的实现细节不用关心,只要调用相关的API函数就可以了。 访问名称服务 用于名称服务的首选接口是函数getaddrinfo()函数 GetAddrInfo.c #include stdio.h #include stdlib.h #include string.h #include netdb.h #include Practical.h int main(int argc, char *argv[]) { if (argc != 3) DieWithUserMessage(Parameter(s), Address/Name Port/Service); char *addrString = argv[1]; // Server address/name char *portString = argv[2]; // Server port/service struct addrinfo addrCriteria; memset(addrCriteria, 0, sizeof(addrCriteria)); addrCriteria.ai_family = AF_UNSPEC; addrCriteria.ai_socktype = SOCK_STREAM; addrCriteria.ai_protocol = IPPROTO_TCP; struct addrinfo *addrList; int rtnVal = getaddrinfo(addrString, portString, addrCriteria, addrList); if (rtnVal != 0) DieWithUserMessage(getaddrinfo() failed, gai_strerror(rtnVal)); for (struct addrinfo *addr = addrList; addr != NULL; addr = addr-ai_next) { PrintSocketAddress(addr-ai_addr, stdout); fputc(\n, stdout); } freeaddrinfo(addrList); // Free addrinfo allocated in getaddrinfo() exit(0); } 运行结果 addrinfo结构体 struct addrinfo { int ai_flags; /* Input flags. */ int ai_family; /* Protocol family for socket. */ int ai_socktype; /* Socket type. */ int ai_protocol; /* Protocol for socket. */ socklen_t ai_addrlen; /* Length of socket address. */ struct sockaddr *ai_addr; /* Socket address for socket. */ char *ai_canonname;/* Canonical name for service location. */ struct addrinfo *ai_next; /* Pointer to next in list. */ }; 详细信息 getadd
文档评论(0)