Jump to content

Recommended Posts

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 ip

adica 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 by rtfmplay

Share this post


Link to post
Share on other sites

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++

Share this post


Link to post
Share on other sites

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;
}

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...