C++ / Qt:如何检测主机名或IP地址何时引用当前系统?

C++ / Qt: How can I detect when a hostname or IP address refers to the current system?

本文关键字:何时 地址 IP 引用 系统 主机 Qt 何检测 检测 C++      更新时间:2023-10-16

我正在使用Qt编写一个macOS C++应用程序,它同时充当UDP客户端和UDP服务器。服务器功能允许用户配置将在哪个端口上接收 UDP 数据包,客户端功能允许指定目标主机和端口号。主机可以是主机名或 IP 地址,包括解析为多播或广播地址的地址或主机名。

为了帮助防止循环,当启用服务器功能时,我需要能够在用户为客户端输入的主机和端口将数据包直接发送到应用程序的服务器时发出警告。当然,检查端口号是否匹配很容易,但这意味着我需要知道他们输入的主机是否是指当前系统。

通常有问题的主机名或 IP 地址示例:

  • 127.0.0.1
  • localhost
  • 192.168.1.255(假设系统位于192.168.1.0/24子网上(
  • 分配给当前系统网络接口的任何 IP 地址
  • 系统的本地 DNS 名称
  • 127.0.0.1之外,可以配置的任何其他环路地址

我怎样才能检测到这一点?

由于这个应用程序是使用Qt编写的,因此专门使用Qt框架的解决方案将是理想的。但是,如果这是不可能的(因为Qt不能处理所有可能的用例(,那么特定于macOS的解决方案也可以使用。

QNetworkInterface 类应该提供您可能需要的最多信息。 您可以使用 QNetworkInterface::allAddresses(( 静态函数获取 IP 地址列表。

您还可以使用 QNetworkInterface::allInterfaces(( 获取所有接口的列表。

为 QNetworkInterface::allInterfaces(( 返回的每个 QNetworkInterface 调用 QNetworkInterface::addressEntries(( 将为您提供有关每个接口的地址条目的更多信息。

auto ifs = QNetworkInterface::allInterfaces();
foreach (auto interface , ifs){
auto addresses = interface.addressEntries();
foreach ( auto addy , addresses){
///play with the addy here.
}
}

您还可以使用 QDnsLookup 类针对要禁止的 IP 地址测试主机名。