我正在使用同时充当 UDP 客户端和 UDP 服务器的 Qt 编写 macOS C++ 应用程序。服务器功能允许用户配置接收 UDP 数据包的端口,客户端功能允许指定目标主机和端口号。主机可以是主机名或 IP 地址,包括解析为多播或广播地址的地址或主机名。
为了帮助防止循环,启用服务器功能后,我需要能够在用户为客户端输入的主机和端口将数据包直接发送到应用服务器时警告用户。当然,检查端口号是否匹配很容易,但这意味着我需要知道他们输入的主机是否指的是当前系统。
通常会出现问题的主机名或 IP 地址示例:
127.0.0.1
本地主机
192.168.1.255
(假设系统位于192.168.1.0/24
子网上)- 分配给当前系统网络接口(interface)的任何 IP 地址
- 系统的本地 DNS 名称
- 除了
127.0.0.1
以外的任何其他环回地址
我怎样才能检测到这个?
由于此应用程序是使用 Qt 编写的,因此专门使用 Qt 框架的解决方案将是理想的。但如果这不可能(因为 Qt 无法处理所有可能的用例),那么 macOS 特定的解决方案也可以。
最佳答案
QNetworkInterface类(class)应提供您可能需要的最多信息。 您可以使用 QNetworkInterface::allAddresses() 获取 IP 地址列表静态函数。
您还可以使用 QNetworkInterface::allInterfaces() 获取所有接口(interface)的列表.
调用 QNetworkInterface::addressEntries()对于每个 QNetworkInterface由 QNetworkInterface::allInterfaces() 返回将为您提供有关每个接口(interface)的地址条目的更多信息。
auto ifs = QNetworkInterface::allInterfaces();
foreach (auto interface , ifs){
auto addresses = interface.addressEntries();
foreach ( auto addy , addresses){
///play with the addy here.
}
}
您还可以使用 QDnsLookup 来针对您要禁止的那些 IP 地址测试主机名。类。
关于C++/Qt : How can I detect when a hostname or IP address refers to the current system?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59145807/