15,629
社区成员




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));