【问题标题】:C++ / Qt: How can I detect when a hostname or IP address refers to the current system?C++ / Qt:如何检测主机名或 IP 地址何时引用当前系统?
【发布时间】:2020-03-27 11:20:24
【问题描述】:

我正在使用 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 特定的解决方案也可以工作。

【问题讨论】:

    标签: c++ macos qt networking udp


    【解决方案1】:

    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 地址测试主机名。

    【讨论】:

    • 我最终做的是遍历所有活动的网络接口,获取它们的地址条目并检查用户输入的主机的 IP 地址是否与任何活动网络的 IP 或广播地址匹配界面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2018-12-07
    • 2014-12-19
    • 2014-12-02
    相关资源
    最近更新 更多