Sockety C++
-
jorg22
Medium Professional
- Príspevky: 1087
- Registrovaný: 12 aug 2006, 20:39
- Kontaktovať používateľa:
Sockety C++
Vedel by mi niekto poradit ako otestovat co najviac IP adries v co najkratsom case vo windowse? Snazim sa vytvorit program, ktory bude hromadne zistovat ci na IP bezi HTTP server, odoslat poziadavku a prijat odpoved. Zatial sa mi podarilo klasickymi socketmi dostatocne rychlo testovat IP, ale musel som pouzit okolo 500 vlakien. Vtedy mi zamrzal cely PC tak som sa to snazil prerobit.
Na internete som nasiel ze sa daju sockety prepnut do neblokovacieho rezimu. Tak som to skusil touto metodou:
- Pripojim sa postupne napr. na 100 IP. Kazda ma vlastny socket.
- V dalsom vlakne mam select, ktory dokola kontroluje ci sa uz da na socket zapisovat. Ked sa da zapisovat socket vlozi do vektoru na odosielanie dat.
- V dalsom vlakne kontrolujem ci sa zmenil vektor so socketmi, na ktore sa da zapisovat. Ak sa zmenil, na kazdy socket sa posle vlastny packet. Po odoslani sa vlozia tieto sockety do dalsieho vektoru na prijmanie dat.
- V dalsom vlakne prejdem cely vektor so socketmi na prijmanie dat. Pomocou funkcie select zistim sockety, z ktorych sa da citat. Precitam ich a tie, z ktorych sa este neda citat poslem do dalsieho kola slucky, ktora ich znova vyhodnoti ci sa uz z nich da citat.
Ale je to ovela pomalsie ako sposob s 500 vlaknami. Teraz mam len 3 vlakna.
Tiez som nastavil limit pripojeni FD_SETSIZE 10000.
Ale stale za 60 sekund viem najst len 60 existujucich IP adries a hlavne mi to blokuje internetovu komunikaciu na celom PC. Vobec nejdu nacitavat stranky. V povodnom rieseni som vedel za 60 sekund najst 400 IP adries ale zamrzal PC.
Tak hlavna otazka je ake riesenie je najvhodnejsie a ci som spravne pochopil pracu s neblokujucimi socketmi?
Na internete som nasiel ze sa daju sockety prepnut do neblokovacieho rezimu. Tak som to skusil touto metodou:
- Pripojim sa postupne napr. na 100 IP. Kazda ma vlastny socket.
- V dalsom vlakne mam select, ktory dokola kontroluje ci sa uz da na socket zapisovat. Ked sa da zapisovat socket vlozi do vektoru na odosielanie dat.
- V dalsom vlakne kontrolujem ci sa zmenil vektor so socketmi, na ktore sa da zapisovat. Ak sa zmenil, na kazdy socket sa posle vlastny packet. Po odoslani sa vlozia tieto sockety do dalsieho vektoru na prijmanie dat.
- V dalsom vlakne prejdem cely vektor so socketmi na prijmanie dat. Pomocou funkcie select zistim sockety, z ktorych sa da citat. Precitam ich a tie, z ktorych sa este neda citat poslem do dalsieho kola slucky, ktora ich znova vyhodnoti ci sa uz z nich da citat.
Ale je to ovela pomalsie ako sposob s 500 vlaknami. Teraz mam len 3 vlakna.
Tiez som nastavil limit pripojeni FD_SETSIZE 10000.
Ale stale za 60 sekund viem najst len 60 existujucich IP adries a hlavne mi to blokuje internetovu komunikaciu na celom PC. Vobec nejdu nacitavat stranky. V povodnom rieseni som vedel za 60 sekund najst 400 IP adries ale zamrzal PC.
Tak hlavna otazka je ake riesenie je najvhodnejsie a ci som spravne pochopil pracu s neblokujucimi socketmi?
Re: Sockety C++
Teda čo vlastne robíš je, že vytvoríš n pripojení asynchrónne, ale ďalej čas inak využitý blokovaním po dobu t využívaš blokovaním po dobu t - n*cas_na_1_pripojenie. Samotný cas_na_1_pripojeni] býva však dosť malý, čiže program až tak nezrýchľuješ, no predsalen niečo môžeš (závisí od bufferov operačného systému a driverov pre tvoju sieťovú kartu) ušetriť.Na internete som nasiel ze sa daju sockety prepnut do neblokovacieho rezimu. Tak som to skusil touto metodou:
- Pripojim sa postupne napr. na 100 IP. Kazda ma vlastny socket.
- V dalsom vlakne mam select, ktory dokola kontroluje ci sa uz da na socket zapisovat. Ked sa da zapisovat socket vlozi do vektoru na odosielanie dat.
Tu je ten bod kde sa to spomaľuje. Prakticky na reálne paralelných systémoch (všetky vlákna sa vykonávajú súčastne, jednoducho povedané 1 vlákno = 1 jadro) by sa jednalo o rýchlo pracujúci kód (znova v závislosti od zdieľaných zdrojov ako RAM, rôzne zariadenia), ale na systémoch využívajúcich pseudoparalelizmus (počet vláken > počet jadier) strácaš čas dopytovaním (polling) na zmenu. Riešením je teda toto konzumujúce vlákno uspať, a zobúdzať iba v prípade že preň existujú dáta na spracovanie- V dalsom vlakne kontrolujem ci sa zmenil vektor so socketmi, na ktore sa da zapisovat.
Podobne ako v predošlom prípade, je zbytočné čakať na odpoveď týmto spôsobom.- V dalsom vlakne prejdem cely vektor so socketmi na prijmanie dat. Pomocou funkcie select zistim sockety, z ktorych sa da citat. Precitam ich a tie, z ktorych sa este neda citat poslem do dalsieho kola slucky, ktora ich znova vyhodnoti ci sa uz z nich da citat.
-
jorg22
Medium Professional
- Príspevky: 1087
- Registrovaný: 12 aug 2006, 20:39
- Kontaktovať používateľa:
Re: Sockety C++
Uspat vlakno myslis napr. tymo sposobom?
while( !data_na_spracovanie )
Sleep(1);
Lebo ak hej tak to robim. Ale ja nemam problemy s vytazenim CPU. CPU je vytazene max na 5%. Ja mam problemy s mnozstvom pripojeni. Ja by som chcel aby som mohol naraz spracovat napr. 1000 pripojeni ale nieco mi to obmedzuje. Tak sa snazim prist na sposob ako obsluzit 1000 pripojeni bez toho aby sa mi zablokovalo pripojenie na internet.
Timeout pri pripojeni mam 500ms. Takze ak by som to nerobim asynchronne(pomocou funkcie select) tak by som musel cakat na kazde pripojenie 500ms. Ale asynchronne mozem poslat poziadavku na pripojenie naraz na vsetky sockety a naraz obsluzit viac poziadaviek. Viem ze sa to nedeje uplne paralelne ale podla mna to ani nieje nutne robit uplne paralelne ak mam dostatocne rychle CPU.
Mozno len nieco zle chapem tak ma oprav ak sa ti nieco nezda.
while( !data_na_spracovanie )
Sleep(1);
Lebo ak hej tak to robim. Ale ja nemam problemy s vytazenim CPU. CPU je vytazene max na 5%. Ja mam problemy s mnozstvom pripojeni. Ja by som chcel aby som mohol naraz spracovat napr. 1000 pripojeni ale nieco mi to obmedzuje. Tak sa snazim prist na sposob ako obsluzit 1000 pripojeni bez toho aby sa mi zablokovalo pripojenie na internet.
Timeout pri pripojeni mam 500ms. Takze ak by som to nerobim asynchronne(pomocou funkcie select) tak by som musel cakat na kazde pripojenie 500ms. Ale asynchronne mozem poslat poziadavku na pripojenie naraz na vsetky sockety a naraz obsluzit viac poziadaviek. Viem ze sa to nedeje uplne paralelne ale podla mna to ani nieje nutne robit uplne paralelne ak mam dostatocne rychle CPU.
Mozno len nieco zle chapem tak ma oprav ak sa ti nieco nezda.
Re: Sockety C++
A nemyslíš, že práve toto je problém? Veď ty by si to CPU chcel využívať ideálne na 100%jorg22 napísal:Ale ja nemam problemy s vytazenim CPU. CPU je vytazene max na 5%.
-
jorg22
Medium Professional
- Príspevky: 1087
- Registrovaný: 12 aug 2006, 20:39
- Kontaktovať používateľa:
Re: Sockety C++
BX idealne hej ale sietovka ani router by podla mna nieco take nezvladli. Preto potrebujem nejaky sposob ako natlacit do tej sietovky co najviac pripojeni naraz.
-
harrison314
Hardcore addict
- Príspevky: 8219
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Sockety C++
Ono je dost dolezite co vlastne robis, lebo napriklad ak crawlujes web, tak ta najviac brzdi DNS a disky.
OS zvlada tisicky vlakien, len tam uz nastava velky overhead.
OS zvlada tisicky vlakien, len tam uz nastava velky overhead.
-
jorg22
Medium Professional
- Príspevky: 1087
- Registrovaný: 12 aug 2006, 20:39
- Kontaktovať používateľa:
Re: Sockety C++
Necrawlujem weby. Iba zistujem ci tam bezi HTTP serever a spracuvam prvy vysledok co mi pride, potom hned zatvaram komunikaciu.
-
harrison314
Hardcore addict
- Príspevky: 8219
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Sockety C++
Prosim napis co robis, a ako by ten program mal pracovat.
Bez toho sa seriozne poradit neda.
Bez toho sa seriozne poradit neda.
Re: Sockety C++
Potrebujes to sam programovat? Ak nie tak pouzi nmap
-
jorg22
Medium Professional
- Príspevky: 1087
- Registrovaný: 12 aug 2006, 20:39
- Kontaktovať používateľa:
Re: Sockety C++
harrison314: Chcel som sa lepsie naucit pracovat s threadmi a socketmi, tak ma napadlo ze by som skusil generovat nahodne IP, pripojit sa k nim a zistit ci na nich bezi HTTP s povolenym prezeranim priecinkov. Takze sa potrebujem pripojit na velke mnozstvo IP na porte 80 lebo aj tak aspon polovica IP adries nebude mat spusteny HTTP server alebo neexistuje.
Potom mi staci nacitat index stranky a zistit ci obsahuje retazec "Index of".
Baseilos: chcem to naprogramovat, ale ak existuje nieco co to dokaze lepsie tak by som to chcel skusit pre porovnanie. Ale zda sa ze nmap nieje riesenie na moj problem.
Potom mi staci nacitat index stranky a zistit ci obsahuje retazec "Index of".
Baseilos: chcem to naprogramovat, ale ak existuje nieco co to dokaze lepsie tak by som to chcel skusit pre porovnanie. Ale zda sa ze nmap nieje riesenie na moj problem.
-
harrison314
Hardcore addict
- Príspevky: 8219
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Sockety C++
to si si mohol zvolit daco rozumenjsie, lebo plno priecinkov index of je podpriecinkoch a v subdomenach,
skus si spravit jednoduchy HTTP server, ktory bude robit daco uzitocne, mas tam sokety aj vlakna,
napriklad ked som sa to ucil ja tak som spravil http server ktory posle screen obrazovky alebo sprav primitivny "html" server, ktory bude podporovat .html subory .jpg obrazky a suborovu strukturu, nie je to az tak vela prace a zopakujes si aj spracovanie retazcov a regexi
skus si spravit jednoduchy HTTP server, ktory bude robit daco uzitocne, mas tam sokety aj vlakna,
napriklad ked som sa to ucil ja tak som spravil http server ktory posle screen obrazovky alebo sprav primitivny "html" server, ktory bude podporovat .html subory .jpg obrazky a suborovu strukturu, nie je to az tak vela prace a zopakujes si aj spracovanie retazcov a regexi
-
jorg22
Medium Professional
- Príspevky: 1087
- Registrovaný: 12 aug 2006, 20:39
- Kontaktovať používateľa:
Re: Sockety C++
Ja viem ze to nieje idealna aplikacia. Ale chcel by som to nejak rozumne spojazdnit. Ked sa budem nudit tak spravim ten HTTP server ale zatial chcem dokoncit toto. Tak mas nejake napady ako spravit tu moju aplikaciu aby bola efektivna? O subdomeny atd sa nestaram.
-
harrison314
Hardcore addict
- Príspevky: 8219
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Sockety C++
Podla mna ma OS nejaky maximalny pocet otvorenych konekcii, takisto sietovka neunesie vsteko, preto by som hladal optimalny pocet vlakien a koketov. Nepozeraj na vytazenie procesora 