|
[ u_m @ 29.09.2004. 18:31 ] @
| Uvod: Nov sam u C-u, spremam ispit iz njega, a inace se osrednje snalazim u php-u.
Zaplet: Napravio sam mini pretrazivac u php-u koji se kaci na odredjen url, pronalazi trazen termin i taj termin vraca kao potvrdu (ili u slucaju , temperatura: 17stepeni, na zahtjev temperatura vraca 17stepeni, --ovo je samo primjer--)
Razrada: Php to radi uzasno sporo, kako su zahtjevi povezani( termin se trazi na nekoliko stranica) ovo traje preko 20 sec. Kako da ovo odradim iz C-a, bez obzira da li se to ispalti ili ne (u brzini, jer ne znam da li je to zbog linka ili php-a) vec zbog samog treninga.
znaci, posaljem http zahtjev (fopen ili ??) iscitam sve redove iz bafera i trazim zadati termin i na kraju vratim termin (ovo ce se pozivati iz php-a)
Da li fopen da koristim za otvaranje url-ova??
Rasplet:
P.S: koju komandu da koristim za provjeravanje da li je server online, nesto kao ping ili da koristim bas ping, ima li C mogucnost pravljenja socket konekcija? |
[ Mikky @ 29.09.2004. 21:16 ] @
Nije bas tako jednostavno kako si ti zamislio. Treba dosta da se parsuju podaci koje dobijes od servera, takodje treba da saljes HTTP request serveru koji ti potom vraca zeljenu stranicu, naravno dobijes niz bajtova u HTTP HEADER + HTML obliku. Zatim izbacis http header pa u tom HTML-u trazis zeljeni termin, naravno preskaces sve sto je u sklopu tag-ova i HTML jezika. Komunikacija sa serverom se radi preko socketa (vidi na netu beej socket guide tutorial), znaci napravis socket, konektujes se na server, primis podatke, parsujes podatke i vidis dali je trazena rec tu.
Imam malo iskustva sa ovim konkretno radio sam mini web server, u win32asm doduse ali to je sve isto. Sve u svemu dosta posla i C nije bas ko stvoren za to ali naravno sve se moze. Mozda postoji neka biblioteka na netu koja vec sve to radi pa pokusaj sa tim.
Inace da li si siguran da je PHP spor ili je spora internet konekcija?
[ filmil @ 29.09.2004. 21:42 ] @
Citat: Razrada: Php to radi uzasno sporo, kako su zahtjevi povezani( termin se trazi na nekoliko stranica) ovo traje preko 20 sec. Mogao bih da se kladim da je razlog za sporoću tvoj algoritam za pretragu. U tom slučaju prelazak na C će samo da iskomplikuje stvar.
Citat: znaci, posaljem http zahtjev (fopen ili ??) iscitam sve redove iz bafera i trazim zadati termin i na kraju vratim termin (ovo Problem sa C-om je što ništa od toga nemaš već „skuvano“ kao u PHP-u, tako da moraš ili da napraviš dosta infrastrukture sam, ili da koristiš neku od za to namenjenih biblioteka. Na tvom mestu, ostao bih uz PHP. C ima i drugu manu: program ne možeš da postaviš gde hoćeš, već samo na računar koji je isti kao i onaj na kome je program kompajliran. U suprotnom program prosto neće raditi.
f
[ u_m @ 29.09.2004. 22:02 ] @
ok, odustao sam od ovoga, inace imam neki brojac na sajtu, ali on sve podatke cuva u fajlu.
znaci imam .txt fajl i hocu da ga isparsiram u .sql (za mysql input)
izgled jednog reda (tab je separator):
Citat: /index.wml / # Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.51 [en] localhost 1087510894
a treba da bude:
Citat: insert into count_global ( script_name,request_uri,referer,user_agent,remote,datum ) values ( '/index.wml','/','#','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Opera 7.51 [en],',localhost','1087510894');
P.S: u php-u bi ovo sredio za tren, ali C-e me muci
[ bzero @ 30.09.2004. 08:40 ] @
Citat:
P.S: u php-u bi ovo sredio za tren, ali C-e me muci
A zasto bi uopste ovako nesto radio u C-u. Ako neces da radis to u PHP-u, za ovakve stvari su idealni Perl ili Python, nikako C.
[ u_m @ 30.09.2004. 11:30 ] @
Zbog toga sto na ispitu imam zadatke iz C-a, a ja dok vjezbam hocu da radim nesto korisno, ako neko ima neki drugi koristan zadatak, da je jednostavan i da sluzi necemu nek ga post-uje
Znaci mora biti C, tu nema dvoumljenja.
[ leka @ 01.10.2004. 14:29 ] @
Ako zeli da "iscedi suvu drenovinu" onda je C svakako bolje resenje od gore pomenutih jezika...
[ u_m @ 01.10.2004. 16:42 ] @
hajde ljudi dajte nesto konkretno:
kako da iscitam iz fajla ovo i da svaki deo odvojen sa tabom strpam u posebnu promjenjivu??
i kako onda da to upisem u novi fajl ?
fread? fprints?? kako?
[ milos23 @ 01.10.2004. 22:34 ] @
sustina tvog problema je nesto sto se zove konacni automat (posto oni rade prepoznavanje niski)... moraces da znash kakav je tacan zapis web citacha i onda ces napraviti stanja s0, s1, s2, s3, s4 itd u zavisnosti od toga koliko imash reci, a u svako sledece stanje predjes kad procitash tab, a pri tom koristish neki pomocni bafer u koji ces citati trenutnu rec a pri prelasku u novo stanje tu rec ces kopirati u niz reci :o) malo komplikovano
evo kako bi otprilike izgledao algoritam
Code:
enum stanja {s0=0, s1,s2,s3,s4...,GRESKA}
char buffer[MAX_WORD];
char *reci[MAX_WORD];
int c;
c=znak_na_ulazu;//fgetc
dok je na ulazu blanko
c=znak_na_ulazu;
stanje=s0;
dok na ulazu nije '\n' ili stanje nije stanje greskeradi sledece
ovde dodje switch(c)
ako je stanje s0:
ucitaj sledeci
proveri i predji u odgovarajuce stanje i po potrebi zapamti nisku
//gde ti je provera da li je na ulaz tab ili znak ili nesto drugo
//kad procitash rec alocirash i memoriju za rec
stanje s1:......
..............
tako otprilike izgleda svaki automat (DFA i NFA na engleskom) :o)
ako si to reshio onda predji na nesto poput izdvajanja reci iz html dokumenta, tu ces svoje znanje josh vishe istestirati, kao np izdvajanje linkova tj onoga sto ide posle src= izmedju " "
ps>> posebno obrati paznju na rad sa niskama i alokacijom memorije koja ti je u tvom slucaju potrebna, mada s ozbirom da je zapis citacha tacno odredjen i nije ali boze moj
ps>>>>mozes i da smanjis broj stanja na samo 2, a onda ces morati da imash brojac rechi
[ milos23 @ 02.10.2004. 12:39 ] @
ovo ti je bilo jedno programersko resenje, tj ako morash bash ti da implemetrirash stvari, a ako es laksi nachin je da proucis f-ju strtok za koju nisam siguran da li je ima u svakom c-u, ali je ima u bibliotekama uz gcc pa bi resenje prosto bilo da ucitash jedan po jedan red (ili samo jedan, to nisi rekao koliko treba ili ja nisam procitao) i onda pozovesh par puta strtok sa separatorom \t ili ' ' u zavisnosti od toga sta je izmedju rechi
[ u_m @ 02.10.2004. 19:13 ] @
za parser: samo malo, zar ne bi bilo lakse da , posto znam kako izgleda fajl, iscitavam podatke sa fread () odnosno sa fscanf() i da ih automatski ubacivam u za to pripremljenu strukturu?
za pretrazivac: da li fopen moze da otvori fajl preko neta, nesto kao:
Code: fopen ("http://www.elitesecurity.org","r")
[ filmil @ 02.10.2004. 20:23 ] @
Citat: za pretrazivac: da li fopen moze da otvori fajl preko neta, nesto kao:
Ne. Suviše očekuješ.
f
[ milos23 @ 02.10.2004. 21:29 ] @
Citat: u_m: za parser: samo malo, zar ne bi bilo lakse da , posto znam kako izgleda fajl, iscitavam podatke sa fread () odnosno sa fscanf() i da ih automatski ubacivam u za to pripremljenu strukturu?
pa dobro ali koliko sam ja shvatio ti si sam to zeleo da odradish :o)
naravno da mozes
[ u_m @ 05.10.2004. 16:25 ] @
izgleda da ne mogu sam, pokusavam vec duze vreme sa fprintf i fscanf ali nece
Evo kako izgledju te dve funkcije:
Code:
while (fscanf (ulaz, "%s%s%s%s%s%s",&ActualURL, &RequestedURL, &Referer, &UA, &Remote, &HitTime) != EOF)
{
fprintf (izlaz, "%s%s%s%s%s%s%s%s%s%s%s%s%s\n",&insert, &ActualURL,
&razmak, &RequestedURL, &razmak, &Referer, &razmak, &UA, &razmak, &Remote, &razmak, &HitTime, &kraj);
}
pa ako ne gresim tu, sad cu zakaciti i citav programcic uz poruku, mozda gresim ovdje, znaci
Parser ulas.txt izlaz.sql - treba od one gore txt linije stvori sql upit, ali ...
[ milos23 @ 06.10.2004. 12:03 ] @
pa gresis ovde jer ne znash kako se koriste scanf i printf (i njihovi parnjaci sa f)
kad ucitavash u stringovne promenljive ne treba ti & jer je samo ime stringovne promenljive pokazivach na memorijsku adresu, a printf nikad ne koristis sa & i to ti je to..........plus mislim da fscanf ne mozes da testirash na EOF vec pitaj dok je vece od 0 jer on vraca broj argumenata koji je prepoznao
[ milos23 @ 06.10.2004. 12:05 ] @
eh da i sta ti je razmak? valjda treba da koristis izmedju navodnika \t ili sta ti vec treba a ne da definishesh promenljivu koja ce nesto tako sadrzati
[ u_m @ 06.10.2004. 18:17 ] @
Taj gornji kod je bio poslje vise pokusaja, pa sam zbog toga ubacio & , jer nije ni bez njih radilo, bio je problem u deklarisanju promjenjivih
A i u \t i da a pokazuje koliko promjenjivih je ucitano
Code:
char ActualURL[300],RequestedURL[300], Referer[300], UA[200], Remote[100], HitTime[20];
a=fscanf (ulaz, "%s\t%s\t%s\t%s\t%s\t%s",ActualURL, RequestedURL, Referer, UA, Remote, HitTime);
printf ("%d%s%s%s%s%s%s%s%s%s%s%s%s%s",a,insert, ActualURL, razmak, RequestedURL, razmak, Referer, razmak, UA, razmak, Remote, razmak, HitTime, kraj);
Samo sad se pojavio novi problem, UA treba sadrzi i znakove razmaka, a fscanf automatski "sjece" na njima, kako da mu kazem da "sjece" samo na \t
[ u_m @ 06.10.2004. 19:26 ] @
mislim da ce ovdje ipak morati ona procedura gore da se implementira, od fscanf nema nista
a za malo da prodje, samo da ne , kako rekoh , "sjece" i na space -ovima , jer ovako ispisuje dosta dobro, ali kako ne znam koliko polje UA ima djelova razdvojenih space-om ne vredi
aj da probam shvatiti onu gore proceduru ili da smislim nesto slicno sam, mislim da imam bolju ideju, evo hint koji imam na umu:
n=1, m=1
citam znak po znak, sacuvavam ga u niz[m][n] i kad naletim na \t n++, a ako naletim na \n n=0 , m++
ima li ovo smisla?
pogotovo ako se zna da je ulazni fajl velicine 3MB texta, da li da koristim dinamicku memoriju
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|