如何在 Qt 绑定到特定接口/IP 中发出网络请求?
Posted
技术标签:
【中文标题】如何在 Qt 绑定到特定接口/IP 中发出网络请求?【英文标题】:How do I make a network request in Qt binding to a specific interface/IP? 【发布时间】:2014-04-04 02:51:38 【问题描述】:所以从 Qt 5 开始,QHttp is deprecated 和我们都应该是 use QNetworkAccessManager now。美好的。但是如何从我的多宿主计算机发出请求(HTTP 或其他方式)而不觉得我在玩轮盘赌?
如果there is no way,那么解决方法是什么?对于我现在的具体情况,我只需要通过 HTTP 下载一个文件。但是真的没有办法用 QtNetwork 以通用的方式做到这一点吗?
【问题讨论】:
一年后这个问题还没有解决吗?? 【参考方案1】:快速的解决方法是在您的项目文件中使用它
QT += http
为了兼容性,它仍然可以在 separate module 中使用。
【讨论】:
确实如此。但是,从文档中......“我们强烈建议不要在新代码中使用它。”所以,我希望有一个人们已经在使用新代码的解决方案。 @njahnke:对我来说,如果他们不提供替代方案,他们的建议并不重要。到目前为止,我一直是 qthttp 的快乐用户,没有后顾之忧,但是是的,这只是一个快速的解决方法。【参考方案2】:如果您足够幸运,所需的接口是一个单独的物理(硬件)接口,您可以这样做,例如(web_view
是 QWebView*
):
QNetworkConfigurationManager config_manager;
QList<QNetworkConfiguration> configs = config_manager.allConfigurations();
bool found_interface = false;
QString desired_interface_name("eth1");
foreach (const QNetworkConfiguration &config, configs)
if (config.name() == desired_interface_name)
found_interface = true;
QNetworkAccessManager *network_access_manager = new QNetworkAccessManager;
network_access_manager->setConfiguration(config);
web_view->page()->setNetworkAccessManager(network_access_manager);
break;
if (!found_interface)
//we failed to find the interface!
同样,如果 IP 绑定到一个物理接口的虚拟接口部分(例如 eth1:1
、eth1:2
等),这将不起作用。我仍在为这种情况寻找解决方案。
【讨论】:
@njajnke 你能成功绑定 QNetworkAccessManager 吗?前段时间我测试了一个类似的代码,但它在多宿主系统(即 eth0、eth1)上对我不起作用。请求总是通过默认 gw 路由以上是关于如何在 Qt 绑定到特定接口/IP 中发出网络请求?的主要内容,如果未能解决你的问题,请参考以下文章
在发送传出请求之前将新的 SoapClient 绑定到特定的 IP 地址