为什么即使服务器上没有运行这样的服务,getaddrinfo也会返回服务端口?

时间:2019-10-24 03:31:05

标签: c sockets unix

  

给出主机名和服务名,getaddrinfo()返回以下内容的列表:   套接字地址结构,每个结构都包含一个IP地址和   端口号。

用法:getaddrinfo("stackoverflow.com", "https", &hint, &ailist)

但是似乎getaddrinfo并未检查服务是否正在服务器上运行。两者都不检查端口。它只会返回默认端口是什么。

例如,即使我的服务器上没有运行httphttps服务,它也会返回端口80443。对于另一台服务器,ssh正在端口27000上运行,但它还会返回默认端口22

那么调用getaddrinfo是什么意思?它似乎只做dns解析。

(我很困惑。该函数的功能根本与它的名称不匹配...)

完整的例子。 https://www.onlinegdb.com/HJfEGOcRtS
(您可以分叉代码段并尝试使用其他运行时参数。)

2 个答案:

答案 0 :(得分:2)

getaddrinfo函数并不是要查看特定服务是否正在运行。它的作用是在给定的主机名上查找名称,并填充一个struct sockaddr结构,该结构适用于连接,发送或绑定到IP /端口对。 / p>

主机名查找部分对本地主机文件和DNS服务器进行典型检查。服务名称查找检查/ etc / services文件以获取与命名服务关联的端口号。例如,您将在此文件中找到以下条目:

https           443/tcp

因此,ailist数组将包含具有stackoverflow.com和端口443 IP地址的条目。然后,您可以将这些struct sockaddr实例之一传递到connect进行连接该服务。

答案 1 :(得分:1)

是的,在相关的手册页(http://man7.org/linux/man-pages/man3/getaddrinfo.3.html)中:

"The getaddrinfo() function combines the functionality provided by
the gethostbyname(3) and getservbyname(3)"

即,主机查找(可以从/ etc / hosts,然后是DNS,具体取决于您的配置),以及服务端口查找,通常是从/ etc / services,但可以来自其他数据库。

不需要在这些地址和端口上放置内容,严格来说,这是数据库查找。