C++/Qt:如何检测主机名或 IP 地址何时引用当前系统?
C++ / Qt: How can I detect when a hostname or IP address refers to the current system?
我正在使用同时充当 UDP 客户端和 UDP 服务器的 Qt 编写 macOS C++ 应用程序。服务器功能允许用户配置接收 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 class 应该提供您可能需要的最多信息。
您可以使用 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 class.
针对您要禁止的 IP 地址测试主机名
我正在使用同时充当 UDP 客户端和 UDP 服务器的 Qt 编写 macOS C++ 应用程序。服务器功能允许用户配置接收 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 class 应该提供您可能需要的最多信息。 您可以使用 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 class.
针对您要禁止的 IP 地址测试主机名