2012-12-10 178 views
2

我有一些類來干擾HTTP服務器。 這裏是meaningfull代碼部分:QNetworkAccessManager發送GET兩次

const QString someClass::BASEURL = QString("http://127.0.0.1:8000/?"); 

someClass::someClass(): 
    manager(new QNetworkAccessManager(this)) 
{ 
} 

QNetworkReply *someClass::run(QString request) 
{ 
    qDebug() << request; 
    QEventLoop loop; 
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit())); 
    QNetworkReply *res = manager->get(QNetworkRequest(QUrl(BASEURL + request))); 
    loop.exec(); 
    return res; 
} 

當我打電話方法運行(),有時(未每次)的兩個相同的GET-請求 (I看着使用tcpdump)。 qDebug()執行1次。
我的代碼中是否有一些錯誤?我看不到任何可能的解釋。

更新: 經過一些tcpdump的ouptut研究。
第二次請求後,它發送包含RST標誌的數據包作爲FIN的答案。 但我仍然可以看到觸發問題的TCP流中沒有區別,但沒有。
F.e.這裏是wireshark的輸出。 Stream 8進展順利。 Stream 11Stream 12重複。
我堅持這一點。也許這是服務器大小的一些協議錯誤,我不確定。或者這可能是QNetworkAccessManager中的一個錯誤。

+0

你可以發佈tcpdump的輸出嗎? – sashoalm

+0

這是相當大的,所以我上傳到[pastebin](http://pastebin.com/nPSnGSan) –

回答

2

您是否嘗試過在不使用QEventLoop的情況下將代碼重寫爲更加異步?你的代碼對我來說看起來不錯,但是你可能會遇到一些奇怪的QT錯誤,它會排隊處理請求並在本地作用域中使用QEventLoop。我通常以下列方式使用QNetworkAccessManager發送GET和POST請求:

void someClass::run(QString request) 
    { 
    qDebug() << request; 
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(on_request_complete(QNetworkReply*))); 
    QNetworkReply *res = manager->get(QNetworkRequest(QUrl(BASEURL + request))); 
    } 

    void someClass::on_request_complete(QNetworkReply* response) 
    { 
     // Do stuff with your response here 
    } 
+0

我會試試這個,謝謝。 我已經有方法'runAcync(QString請求)'做同樣的事情。事情是我需要做任何事情之前得到答案,所以我用同步。此外,看起來像連接到QT 4.7.x庫時沒有錯誤。如果這有幫助,我會嘗試同步並進行報告。 –

+0

這很奇怪。我剛剛將循環移到了調用我的'run()'的函數,並將調用更改爲'runAcync()',這有所幫助。這是一個qnet錯誤。萬分感謝! –