Qt5_ss.资料_TcpSocket在Qt5.8之后的默认代理设置
1、QTcpSocket在FQ状态下失效的问题 - 软件开发其他 - 红黑联盟.html(https://www.2cto.com/kf/201807/762304.html)
2、网页内容复制
在写TCP连接程序时,突然发现了这样的错误: socket error: The proxy type is invalid for this operation 发现是FQ状态下进行了连接,翻回墙内之后正常了。这倒是挺有意思,值得研究一下。
先查了stackoverflow,发现是QNeworkProxy的问题,它的枚举ProxyType包含了几种类型,前四个是
DefaultProxy,
Socks5Proxy,
NoProxy``HttpProxy,,是不是问题在这里?在构造函数里定义了tcpSocket之后,加一行
tcpSocket->setProxy(QNetworkProxy::NoProxy);。现在再到FQ状态下测试,发现果然正常了。
这样还没完,要追本溯源研究问题。用sublime搜索文件夹
F:\Qt5.10.1\5.10.1\Src\qtbase\src\network,找这个报错信息,最终发现调用路径是这样的:
先是QNativeSocketEngine::connectToHost
1
2
3
4
5
|
<code><code><code><code><code>{ ... if (!d->checkProxy(address)) return false ; }</code></code></code></code></code> |
然后checkProxy函数
1
2
3
4
5
6
7
8
9
10
11
12
|
<code><code><code><code><code>QNativeSocketEnginePrivate::checkProxy { ...... if (proxy.type() != QNetworkProxy::DefaultProxy && proxy.type() != QNetworkProxy::NoProxy) { // QNativeSocketEngine doesn't do proxies setError(QAbstractSocket::UnsupportedSocketOperationError, QNativeSocketEnginePrivate::InvalidProxyTypeString); return false ; } ...... }</code></code></code></code></code> |
setError函数:
1
2
3
4
5
6
7
|
<code><code><code><code><code>QNativeSocketEnginePrivate::setError { ...... case InvalidProxyTypeString: socketErrorString = QNativeSocketEngine::tr( "The proxy type is invalid for this operation" ); break ; }</code></code></code></code></code> |
原来调用
connectToHost时会先检查代理情况。那么我们试着检查socket的代理类型,用
tcpSocket->proxy().type();分别在FQ和不翻的状态下运行,结果居然都是0,也就是
DefaultProxy,这怎么回事?这样到
checkProxy应该不报错才对啊?
既然这样,那么就是这个函数用的不对,还看帮助吧,找啊找啊,终于找到这样一个函数
[static] QNetworkProxy QNetworkProxy::applicationProxy(),看解释:
Returns the application level network proxying.
If a QAbstractSocket or QTcpSocket has the QNetworkProxy::DefaultProxy type, then the QNetworkProxy returned by this function is used.看来应该使用这个才对啊,再拿
tcpSocket->proxy().applicationProxy().type();试验,这下就会发现未FQ状态是
NoProxy,FQ状态是HttpProxy!
这样一来就清楚了,但是注意上面的解释有一句:If a QAbstractSocket or QTcpSocket has the
QNetworkProxy::DefaultProxy type。那么为什么socket默认用的是
DefaultProxy而不是
NoProxy?这是出于什么考虑?
接着用Google查,发现QTBUG网站和Qt开发者有一些讨论,一位开发者认为既然Chrome都用了系统代理,为什么我们不能?讨论的内容很多,不想都贴出来了,最后的结果是从Qt 5.8开始,socket默认代理类型是
DefaultProxy。
3、
4、
5、