给出主机名和服务名,
getaddrinfo()
返回以下内容的列表: 套接字地址结构,每个结构都包含一个IP地址和 端口号。
用法:getaddrinfo("stackoverflow.com", "https", &hint, &ailist)
但是似乎getaddrinfo
并未检查服务是否正在服务器上运行。两者都不检查端口。它只会返回默认端口是什么。
例如,即使我的服务器上没有运行http
或https
服务,它也会返回端口80
和443
。对于另一台服务器,ssh
正在端口27000
上运行,但它还会返回默认端口22
。
那么调用getaddrinfo
是什么意思?它似乎只做dns解析。
(我很困惑。该函数的功能根本与它的名称不匹配...)
完整的例子。 https://www.onlinegdb.com/HJfEGOcRtS
(您可以分叉代码段并尝试使用其他运行时参数。)
答案 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,但可以来自其他数据库。
不需要在这些地址和端口上放置内容,严格来说,这是数据库查找。