rtfmplay Posted April 23, 2015 Report Posted April 23, 2015 (edited) Salutare,ma intereseaza si pe mine un algoritm simplu in c++ sau c# care sa faca urmatoarele:Am 100 de linkuri si 10 ipuri, linkurile le accesez cu curl si as vrea ca la fiecare 10 linkuri accesate sa schimbe ipadica L1,L2,L3,L4,L5,L6,L7,L8,L9,L10 -> Ip1; L11,L12,L13,L14,L15,L16,L17,L18,L19,L20 -> Ip2; etc pana cand se termina ipurile. Vreau o idee sau cum as putea face...... Edited April 23, 2015 by rtfmplay Quote
theandruala Posted April 23, 2015 Report Posted April 23, 2015 Ai putea folosi un contor?il initializezi cu 0, si de fiecare data cand e divizibil cu 10, sa execute un .bat sau ceva de genu(tin minte ca putea folosi .bat pentru a-ti schimba ip-ul daca ai dinamic) pui si un Sleep(4000) sau mai multe secunde ca sa aibe timp sa schimbe ip-ul si gata.Pt Sleep bagi #include<windows.h>metoda pt C++ Quote
rtfmplay Posted April 23, 2015 Author Report Posted April 23, 2015 Salut, pai nu am de ce sa fol .bat pentru ca ip-urile sunt proxyuri. Quote
nedo Posted April 25, 2015 Report Posted April 25, 2015 Ai explicatii in cod.struct MemStr // structura ce stocheaza datele citite de la site{ string mem; size_t marime;};static size_t WriteMemStr(void* contents, size_t size, size_t nmemb, void* userp) // functia ce face citirea de la site{ size_t realsize = size * nmemb; struct MemStr* mem = (struct MemStr*)userp; mem->mem.append((char*)contents, realsize); mem->marime += realsize; //cout << "contents: " << contents << endl << "mem->mem: " << mem->mem << endl; //cout << "marime mem.mem: " << mem->mem.size() << endl; if(mem->mem.size() == mem->marime) { return realsize; } else { return 0; }}int main(){ std::ifstream fLinkuri("linkuri.txt"); // fisierul din care citesti link-urile(modifici numele fisierului) std::ifstream fProxy("proxyuri.txt"); // fisier in care ai proxy-urile if(!fLinkuri.is_open() || !fProxy.is_open()) // te asiguri ca ai deschis fisierele { cout << "Eroare la deschidere fisiere."; return 0; } CURL* curl = curl_easy_init(); // initializare curl if(!curl) { cout << "Eroare initializare curl: "; return 0; } std::string link; // citesti link in el std::string proxy; // citesti proxy in el int contor = 0; // pentru a schimba proxi-ul MemStr mem; // in mare parte nefolosita, totusi dupa fiecare executie a curl, in mem.memorie ai pagina din link-ul accesat mem.marime = 0; while(std::getline(fLinkuri, link)) { if(contor == 0) { std::getline(fProxy, proxy); } curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemStr); // functia executata pentru citirea datelor primite de la site curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&mem); // variabila in care se salveaza datele curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10); curl_easy_setopt(curl, CURLOPT_URL, link.c_str()); // setam url-ul curl_easy_setopt(curl, CURLOPT_PROXY, proxy.c_str()); // setam link-ul proxy-ului curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); // http://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html alegi din descriere tipul de proxy pe care il poti folosi CURLcode retCode = curl_easy_perform(curl); // executam if(retCode != CURLE_OK) // verificam daca s-a executat cu succes { cout << "Eroare la executare curl: " << curl_easy_strerror(retCode); // afisam eroare daca e cazul } contor++; // incrementam contorul if(contor == 10) // il resetam daca au trecut 10 iterari { contor = 0; } mem.mem.clear(); // golim memoria variabilei in care stocam pagina mem.marime = 0; // setam marimea memoriei la 0(daca uiti sa faci asta, o sa primesti erori } return 0;} Quote