Jump to content
rtfmplay

c++/c# algo

Recommended Posts

Posted (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 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
Posted

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

Posted

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

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