QtNetwork. How to send multiple simultaneous requests via multiple proxy servers?
-
Hello. First of all I want to apologize for my bad English. Okay...
I have list of accounts in format login:password and list of proxies ip:port. My task is to authorize an account and verify some of its characteristics. It is simple to do if I have one connection.By it sounds good if I will be able to send, for example, five requests (POST) from proxies A, B, C, D, E at the same time. Than, if some of them replied I can send request (GET) from the same proxies. If some of them replies I can check content of reply. When all requests replied I select new proxies and repeat the process until all accounts are checked.
Please, see the pictures below to understand better what I am talking about...
!https://dl.dropboxusercontent.com/u/58160380/alg.PNG(algorithm)!I am using Qt 5.1 and now I have this...
(few comments because the function names represent what they are doing)@/// Types
class MyQNetworkAccessManager: public QNetworkAccessManager
{
Q_OBJECTpublic:
MyQNetworkAccessManager():
QNetworkAccessManager(nullptr),
account( {"", ""} ) {}
std::pair<QString, QString> account; // I need network manager to know what account it is checking
};/// Variables...
QVector<MyQNetworkAccessManager*> nam;
QVector<QNetworkProxy> proxies;
QVector<std::pair<QString, QString>> accounts;
qint32 threads; //the size of nam is equal to this/// slots...
void authorizationDone(QNetworkReply *reply);
void openHomepageDone(QNetworkReply *reply);/// functions...
void authorizationRequest(QNetworkAccessManager *manager);
void openHomepageRequest(QNetworkAccessManager *manager);
void process(); // main funtion which send initial requests// simply casts base object to derived
MyQNetworkAccessManager* castToDerived(QNetworkAccessManager *base) const;/// implementation...
MyQNetworkAccessManager* castToDerived(QNetworkAccessManager base) const
{
return static_cast<MyQNetworkAccessManager>(base);
}void process()
{
foreach(MyQNetworkAccessManager *ptr, nam) {
authorizationRequest( ptr );
}
}void authorizationRequest(QNetworkAccessManager *manager)
{
if ( accounts.isEmpty() || proxies.isEmpty() ) {
return;
}manager->clearAccessCache();
// set next proxy
manager->setProxy( proxies.back() );
proxies.pop_back();// set next account
castToDerived(manager)->account = accounts.back();
accounts.pop_back();// send POST request
manager->post(postUrl, postData);// when reply is finished it means that auth done
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(authorizationDone(QNetworkReply*)));
}void openHomepageRequest(QNetworkAccessManager manager)
{
manager->get(getRequest);
connect(manager, SIGNAL(finished(QNetworkReply)), this, SLOT(openHomepageDone(QNetworkReply*)));
}void authorizationDone(QNetworkReply reply)
{
disconnect(reply->manager(), SIGNAL(finished(QNetworkReply)), this, SLOT(authorizationDone(QNetworkReply*)));if ( reply->error() == QNetworkReply::NoError ) { openHomepageRequest(reply->manager()); } } else { authorizationRequest(reply->manager()); }
}
void openHomepageDone(QNetworkReply reply)
{
disconnect(reply->manager(), SIGNAL(finished(QNetworkReply)), this, SLOT(openHomepageDone(QNetworkReply*)));if (reply->error() == QNetworkReply::NoError) {
// extract some info from reply
}
authorizationRequest(reply->manager());
}
@This code works.
!!! But I think it is bad idea to use vector of network managers because documentation says that application should have only one manages. One manager is enough.How can I rewrite this code or algorithm to become better? What to read or study?
Thank you.