• Qt5_ss.资料_TcpSocket在Qt5.8之后的默认代理设置


    1、QTcpSocket在翻墙状态下失效的问题 - 软件开发其他 - 红黑联盟.html(https://www.2cto.com/kf/201807/762304.html

    2、网页内容复制

    在写TCP连接程序时,突然发现了这样的错误: socket error: The proxy type is invalid for this operation 发现是翻墙状态下进行了连接,翻回墙内之后正常了。这倒是挺有意思,值得研究一下。

    先查了stackoverflow,发现是QNeworkProxy的问题,它的枚举ProxyType包含了几种类型,前四个是 DefaultProxy,Socks5Proxy,NoProxy``HttpProxy,,是不是问题在这里?在构造函数里定义了tcpSocket之后,加一行tcpSocket->setProxy(QNetworkProxy::NoProxy);。现在再到翻墙状态下测试,发现果然正常了。

    这样还没完,要追本溯源研究问题。用sublime搜索文件夹F:Qt5.10.15.10.1Srcqtbasesrc etwork,找这个报错信息,最终发现调用路径是这样的:
    先是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();分别在翻墙和不翻的状态下运行,结果居然都是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();试验,这下就会发现未翻墙状态是NoProxy,翻墙状态是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、

  • 相关阅读:
    linux
    java对象结构
    jvm之java类加载机制和类加载器(ClassLoader)的详解
    二进制运算符及补码
    java导出word格式的文件
    rpm命令详解
    word转pdf
    应用缓存
    fullPage.js+Stellar.js+circlr.js
    评分案例
  • 原文地址:https://www.cnblogs.com/cppskill/p/11730452.html
Copyright © 2020-2023  润新知