繁体   English   中英

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

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

我正在使用 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 地址测试主机名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM