2012-08-27 40 views

回答

2

這是不可能開箱的。但看看Qt Torrent Example,特別是RateControllerratecontroller.h | ratecontroller.cpp)。這個類幾乎可以通過控制一個而不是一個連接來實現你想要的。

然而,這樣的速度控制器上運行QTcpSockets(準確的PeerWireClients),所以你需要改變「同行」的類型爲QIODevice,我希望並不難,因爲從PeerWireClient繼承QTcpSocket,這本身從QIODevice繼承:

// old 
void addSocket(PeerWireClient *socket); 
// new 
void addDevice(QIODevice *device); 

(注意,從洪流例如RateController controlls上載和下載,但你只需要控制下載速率所以,你可以刪除不必要的代碼。)

然後你需要通過你的QNetworkAccessManager提出的請求使用這個速率控制器。這可以通過重新實現QNetworkAccessManager並覆蓋(擴展)方法QNetworkAccessManager::createRequest來完成,每當創建新請求時都會調用該方法。此方法返回QNetworkReply*(從QIODevice*繼承),其中,下載將被讀取,所以告訴流速控制器控制該設備將限制下載速率:

QNetworkReply *MyNetworkAccessManager::createRequest(
       QNetworkAccessManager::Operation op, 
       const QNetworkRequest &req, 
       QIODevice *outgoingData) 
{ 
    // original call to QNetworkAccessManager in order to get the reply 
    QNetworkReply *reply = QNetworkAccessManager::createRequest(op, req, outgoingData); 

    // add this reply (which is a QIODevice*) to the rate controller 
    rateController.addDevice(reply); 

    return reply; 
} 

你不會有,如果你要繼承QNetworkAccessManager已經知道你實際執行請求的代碼段。方法get()post()返回QNetworkReply*,您也可以將其添加到速率控制器。 (不過這樣一來,你手動做到這一點外的經理,這是不符合信息/隱藏執行的概念,在這種情況下的事實,下載是速度控制。)

+0

其實,我不會使用QTcpSocket,QNetworkAccessManager是否可能?我的意思是這樣的可能:http://qt-project.org/forums/viewthread/19134/ –

+0

對不起,我完全忘了。我改編了我的答案。我希望這會起作用,因爲我從來沒有這樣做過。但是這應該可以做到這一點。請注意,您甚至需要去QIODevices,因爲QNetworkAccessManager不會告訴您套接字,而是目標設備。將寫入速度限制在目標設備中=限制下載速度。 – leemes

+0

哦,我只注意到這不起作用,因爲'outgoingData'是要爲HTTP POST請求上傳的數據。我們需要將答覆本身而不是outgoingData放入速率控制器。 – leemes