QT socket使用内部自带的超时属性设置连接超时时间

kc__jm 2023-05-08 11:37:56
QTcpSocket操作默认都是异步操作,connectToHost连接也是立刻返回,没有返回值,通过信号获取是否成功,这个问题也不大,但是这个默认超时时间30s有点长,没有明显的其他成员函数可以修改这个超时时间,网上找了一些方法也没明显效果,在查看源码时发现了一种方法方法:在qabstractsocket.cpp源码文件的QAbstractSocketPrivate::_q_connectToNextAddress()函数中,创建了一个连接超时的定时器,默认使用QNetworkConfigurationPrivate::DefaultTimeout(30000ms)值作为超时时间,同时判断socket的_q_networksession属性是否存在,存在则从属性获取超时时间,_q_networksession属性为QSharedPointer<QNetworkSession>对象即可;
源码如下:
void QAbstractSocketPrivate::_q_connectToNextAddress()
{
    ......
 
    if (!connectTimer) {
        connectTimer = new QTimer(q);
        QObject::connect(connectTimer, SIGNAL(timeout()),
                                    q, SLOT(_q_abortConnectionAttempt()),
                                    Qt::DirectConnection);
    }
    int connectTimeout = QNetworkConfigurationPrivate::DefaultTimeout;// 默认值为30000ms
#ifndef QT_NO_BEARERMANAGEMENT // ### Qt6: Remove section
    QSharedPointer<QNetworkSession> networkSession = qvariant_cast< QSharedPointer<QNetworkSession> >(q->property("_q_networksession"));
    if (networkSession) {
        QNetworkConfiguration networkConfiguration = networkSession->configuration();
        connectTimeout = networkConfiguration.connectTimeout();
    }
#endif
    connectTimer->start(connectTimeout);
 
    ......
}

自定义超时设置时间如下,亲测有效:

     QNetworkConfigurationManager manager; 
    QNetworkConfiguration config = manager.defaultConfiguration();
    QList<QNetworkConfiguration> cfg_list = manager.allConfigurations();
    if (cfg_list.size() > 0)
    {
        cfg_list[0].setConnectTimeout(3000);
        config = cfg_list[0];
    }
    QSharedPointer<QNetworkSession> spNetworkSession(new QNetworkSession(config));
    commandSocket.setProperty("_q_networksession", QVariant::fromValue(spNetworkSession));
...全文
158 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,492

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧