Mac - 使用Qt检测网络断开连接

时间:2014-07-28 15:03:28

标签: c++ macos qt qnetworkaccessmanager qnetworkreply

我正在编写一个使用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.   
  3. 在10-20秒内从有线切换到WiFi,反之亦然
  4.   

文件下载卡在上述方案中。虽然,这个问题的频率是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;
}               

它在某种程度上运作良好。但即便如此,如果&#LAN; LAN卡拉回插入&#39;发生在30秒内,下载再次陷入困境。因此,这种解决方法无法完全解决我的问题。在非常短的时间间隔内轮询并不像任何较短的时间间隔那样适当的解决方案,可能存在竞争条件。

我在这里找到了一种方法来解决这个陷入中间的下载问题。你们中的任何人都可以帮忙找出一种在网络发布时立即通知下载的方法吗?

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

2 个答案:

答案 0 :(得分:1)

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

void QNetworkSession :: stateChanged(QNetworkSession :: State state)[signal]

  

只要网络会话状态发出此信号   变化。 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();

答案 1 :(得分:0)

您可以使用QNetworkConfigurationManager::onlineStateChanged(bool isOnline)信号来跟踪您是否已连接到网络。