我正在梳理一个简单的客户端套接字程序,以了解它是如何工作的。
当我致电gethostbyname()
时,它会填充我hostent
结构中的各个字段。但是,当我将h_addr
复制到h_length
结构时,使用的唯一字段是h_addr
和sockaddr_in
。何时使用其他字段,例如h_name
或h_aliases
?
我还有一个次要问题,我也会在这里投入。
当我们将sin_family
中的sockaddr_in
字段设置为AF_INET
(或我们正在使用的任何值)时,为什么我们不做从我们的hostent
结构h_addrtype
复制,因为它已经存在?
(顺便说一下,我在网上看过gethostbyname()已经过时了,所以不要太在意我的例子中使用它。)
答案 0 :(得分:0)
在线manual page for gethostbyname
解释说:
h_name
字段用作"主机的官方名称"。h_aliases
字段用作"别名列表"。但是用我自己的话来说......
我使用h_name
字段来获取主机的正确名称,因为调用gethostbyname
的名称可能是列出的别名之一。或者,我可以使用h_aliases
字段,如果我想知道可以使用哪些其他名称来引用相同的hostent
结构。
例如,公司可能有一项政策,即所有联网计算机必须具有美国州名称的正式名称。在命名一台将成为该公司网络服务器的计算机之前,这可能正常。 Alabama
可能是一个很好的状态和一台优秀的计算机,但没有人会期望必须使用类似{{1}的网址来访问公司的网络服务器}。相反,网址更常见的是https://Alabama.thegreatcompany.com/
(https://www.thegreatcompany.com/
之前的www
而不是thegreatcompany.com
)。解决此问题的方法是为Alabama
的{{1}}主机使用别名。这种方式Alabama
出现在www
字段和Alabama
字段中的h_name
。
关于次要问题,您可以使用www
结构中的信息,但您的客户端将使用获取的信息进行连接,而不是使用通过其他方式获取的信息进行连接。两者都没有任何错误。例如,您的h_aliases
信息来自不可靠的来源。在这种情况下,可能最好将该信息硬编码到客户端套接字程序中。