3

我正在编写一个应用程序来使用 Qt 下载文件。代码片段是

QNetworkAccessManager nam = new QNetworkAccessManager();

QNetworkRequest request;
request.setUrl(kUrl);

QNetworkReply reply;
//connect error(), finished(), downloadProgress(b,t) signal of reply object
reply = nam.get(request);

它工作正常,但在 Mac 中的某些情况下,下载会永久卡住而没有错误回调。这些情况是

  1. 拔出 LAN(互联网)电缆并在 20 秒内快速插入
  2. 在 10-20 秒内从有线切换到 WiFi,反之亦然

文件下载卡在上述场景中。不过,这个问题的频率是 20 次(5%)。为了缓解这种情况,我编写了一个变通方法代码来使用 TCP 套接字检查网络是启动还是关闭,并每 30 秒轮询一次。

bool check()
{
std::auto_ptr<QTcpSocket> sock(new QTcpSocket);
sock->connectToHost(kHostname, kConnectPort);
bool connected = sock->waitForConnected(30000);

if (!connected)
{
    sock->abort();
    return false;
}
sock->close();
return true;
}               

它在一定程度上运作良好。但即便如此,如果在 30 秒内发生“LAN 卡拔出并重新插入”,下载又会卡住。因此,此解决方法无法完全解决我的问题。以非常短的时间间隔进行轮询看起来不是一个合适的解决方案,因为对于任何更短的时间间隔,都可能存在竞争条件。

我被困在这里寻找一种方法来解决这个下载卡在中间的问题。你们中的任何人都可以帮助找出一种在网络中断时立即通知下载的方法吗?

我使用的 Qt 版本是 5.3.1,Mac OS 是 10.9。

4

2 回答 2

1

看看 QNetworkSession 类:http ://doc.qt.digia.com/qtmobility/qnetworksession.html#State-enum

void QNetworkSession::stateChanged (QNetworkSession::State state) [信号]

每当网络会话的状态发生变化时,都会发出此信号。state 参数是新的状态。

例子:

// Set Internet Access Point
QNetworkConfigurationManager manager;

// Is there default access point, use it
QNetworkConfiguration cfg = manager.defaultConfiguration();

// Open session
m_session = new QNetworkSession(cfg);
connect(m_session, SIGNAL(closed()), this, SLOT(closed()));
connect(m_session, SIGNAL(stateChanged(QNetworkSession::State)), this, SLOT(stateChanged(QNetworkSession::State)));
connect(m_session, SIGNAL(error(QNetworkSession::SessionError)), this, SLOT(error(QNetworkSession::SessionError)));
m_session->open();
// Waits for session to be open and continues after that
m_session->waitForOpened();
于 2014-07-30T10:50:07.510 回答
0

You can use QNetworkConfigurationManager::onlineStateChanged(bool isOnline) signal to track whether you are connected to network or not.

于 2016-03-12T10:30:22.470 回答