返回介绍

getaddrinfo() 获取域名的地址

发布于 2024-10-10 23:21:40 字数 2636 浏览 0 评论 0 收藏 0

域名系统(Domain Name System, DNS)是一本巨大的通讯录。计算机向网络发送数据包时需要在地址一栏填写数字形式的 IP 地址,而 DNS 可以把 这样的域名转化为 IP 地址。

www.oreilly.com

创建域名套接字

通常情况下,应该让客户端代码用 DNS 来创建套接字,这样用户就不需要自己去查找 IP 地址。为了使用 DNS,需要以另一种方式构建客户端套接字:

getaddrinfo() 会在堆上创建一种叫名字资源的新数据结构。给定域名和端口号,就可以得到名字资源。名字资源把计算机需要的 IP 地址隐藏了起来,大型网站通常有好几个 IP 地址,代码会从中挑选一个。随后便可以用名字资源创建套接字了。

最后,你可以连接远程套接字。因为名字资源在堆上创建,所以要用一个叫 freeaddrinfo() 的函数清除它。

一旦把套接字连接到远程端口,就可以用 recv() 和 send() 函数读写数据,你在服务器中已用过它们。你现在掌握的知识已经够写一个网络客户端了……

代码冰箱贴

网络客户端的代码如下,它将从维基百科下载某个页面的内容,然后在屏幕上显示。网址将通过参数传给程序。仔细思考一下,如果网络服务器使用了 HTTP 协议,你需要向它发送什么数据?

代码冰箱贴解答

网络客户端的代码如下,它将从维基百科下载某个页面的内容,然后在屏幕上显示。网址将通过参数传给程序。仔细思考一下,如果网络服务器使用了 HTTP 协议,你需要向它发送什么数据?

试驾

编译代码,运行网络客户端,它成功地从维基百科下载到了网页:

成功了!

客户端从命令行读取了网页的名字,然后连接到维基百科下载了网页。因为网页名要建立文件路径,所以必须用下划线(_)替换其中的空格。

滑野雪

为什么不让代码自动把空格替换成下划线?如何替换字符生成网址?详情请见: http://www.w3schools.com/tags/ref_urlencode.asp

 这里没有蠢问题问:我应该用 IP 地址还是域名创建套接字?答:最好用域名。一来域名比较好记,二来服务器有时会改变 IP 地址,但域名一般不会变。问:那我还用知道怎么连接 IP 地址吗?答:需要。如果你要连接的服务器没有在域名系统中注册,比如家庭网络中的计算机,你就需要知道如何用 IP 连接。问:我可以把 IP 地址作为 getaddrinfo() 的参数吗?答:可以。但如果你要连接 IP 地址,可以用第一版创建客户端套接字的代码,它更简单。

 

要点

协议是一段结构化对话。
服务器连接本地端口。
客户端连接远程端口。
客户端和服务器使用套接字通信。

send() 向套接字写数据。

用 recv() 从套接字读数据。

HTTP 是一种网络协议。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文