parsovanie v C++

HackForum

parsovanie v C++#
ako vyparsovat http hlavicky v c?
mam namysli takto
pomocou soketov sa pripojim a "stiahnem" subor do PC
necham ho zobrazit a mam tam hlavicku + moje parametre pre program
ten subor co "stahujem" obsahuje len 1 riadok...
(odpovědět)
nn | 207.81.225.*3.1.2008 11:25
re: parsovanie v C++#
respektive mam sposob ale je to blbost...

text.erase( 0, 215 );
nemusi to byt vzdy dobre...
(odpovědět)
nn | 207.81.225.*3.1.2008 11:27
re: parsovanie v C++#
este jeden problem, na srvri mam ulzeny subor, (spominany subor v tom predchadzajucom probleme)

jeho obsah je toto

download 3 "GET /project/my.txt HTTP/1.1\nhost: subdomena.freehostia.com\n\n" "subdomena.freehostia.com" ".\my.bat"

vysvetlenie:
download znamena ze pc ktory sa pripoji na ten server bude stahovat, 3 znamena ze v dalsom parametri su 3 diery aby sa to zlepilo dohromady (totiz explodujem pomocou " " a to ma nenapadlo ze tam budu diery ako tieto a cely program sa mi nechce prepisovat koli tomu)
ta hlavicka (to mi robi problem) k nej sa dostanem
a ten ".\my.bat" je parameter kde sa ma ulozit subor z serveru

teraz problem, hlavicka,
totiz cely program je rozdeleny... na viecero programov (nie funkcii aby nebol tak velky)
tak sa napriklad funkcia download vola cez parametre dalsieho programu trebarz download.exe
cize mam hl.exe vola download.exe s danymi parametrami, a to je problem.
download.exe volam s parametrami

"GET /project/my.txt HTTP/1.1\nhost: ankety.freehostia.com\n\n" "ankety.freehostia.com" ".\my.bat"
aj s uvodzovkami
a odosle to zle hlavicku a neviem preco.
ked tu hlavicku dam natvrdo do programu tak mi ide vsetko.
(odpovědět)
nn | 207.81.225.*3.1.2008 12:19
re: parsovanie v C++#
Proč escapuješ M v ".\my.bat" ?

Navíc, nenapsal jsi, jak "zle" to hlavičku odešle.
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*3.1.2008 13:58
re: parsovanie v C++#
Cti ze socketu radku po radce a az bude prvni znak radky '\r' nebo '\n', tak nasleduje tvuj vysneny soubor. (RTFRFC)

----------
Harvie's blog: [link] g33k-shop: [link] fs: [link]
Registered GNU/LINUX user #468114 [link]

(odpovědět)
Harvie | E-mail | Website | ICQ 2837829783.1.2008 19:01
re: parsovanie v C++#
neescapujem je to potrebne na vytvorenie toho suboru,
no a hlavicku to odosle zle tk ze ked je tam natvrdo odosle to o 4 byte menej ako ked ju nacitam zo suboru

(odpovědět)
nn | 207.81.225.*3.1.2008 20:52
re: parsovanie v C++#
takze escapovanie som vymyslel takto,
int offset = text.find("\r\n\r\n");
offset+= 4;
text.erase(0,offset);

a tu hlavicku poskladam v programe s dvoch parametrov bez toho aby som do programu download.exe zadaval parameter ako hlavicku.

text=string("GET ") + argv[3] + string("HTTP/1.1\nhost: ") + argv[1] + string("\n\n");
(odpovědět)
nn | 207.81.225.*3.1.2008 21:18
re: parsovanie v C++#
ako stahujete pomocou C++ ked pracujem s DEVc++ a nemam VS C++ tam je nejay hlavickovy subor GETurlmon alebo co to je ale ako stiahnut napr. e.exe subor z serveru???
textove subory su lahke ale ako na tie execka(a ine datove typy)...



(odpovědět)
:> | 193.86.238.*4.1.2008 1:58
re: parsovanie v C++#
ROFL! a jaky je rozdil mezi stahovanim "textoveho" souboru a "execkem" ?
Nevim, co to je GETurl, nikdy jsem to nepouzival. Nejjednodussi je pouzit sockety a poslat na server GET pozadavek... Pro vice komfortu muzes pouzit napriklad libCURL.
A vubec, zacni prectenim nejake prirucky o programovani a nauc se hledat.
(odpovědět)
HC | 90.183.61.*4.1.2008 10:41
re: parsovanie v C++#
No nevim... Chceš psát síťový aplikace a nerozeznáš typ souboru od datového typu? Taky bych ti doporucil precist si neco o tom, jak se pracuje s binarnima (resp. neplaintextovejma) souborama, protoze uz vidim, jak stahnes exac a nepude ti spustit, protoze se ti tim celej rozpadne.

Jinak predpokladam, ze celej ten soubor stahujes do statickyho pole floatů ;D

----------
Harvie's blog: [link] g33k-shop: [link] fs: [link]
Registered GNU/LINUX user #468114 [link]

(odpovědět)
Harvie | E-mail | Website | ICQ 2837829784.1.2008 15:36
re: parsovanie v C++#
Já používám tento způsob a je podle mě nejrychleší

char *buf;
char *ptr;
/*... tady alokuješ potřebnou paměť na buf a umístíš do něj stáhnutá data ...*/
if ((ptr = (char *) strstr(buf, "\r\n\r\n") == NULL)
{
fprintf(stderr, "HTTP parse error!");
return -1;
}
ptr += 4; /* Delka retezce "\r\n\r\n" */
/* ptr teď ukazuje na stáhnutá data bez HTTP hlavičky */

(odpovědět)
nejmenuje | E-mail | Website | ICQ 2600079764.1.2008 12:37
re: parsovanie v C++#
char *buf; buf = NULL; //Nebudeme prasata
char *ptr; ptr = NULL; //Ze?

Jinak brani ti neco nacitat data do statickeho bufferu treba po 1024B a hned je po 1024B ukladat do souboru? No jako zkus si stahnout treba ISO DVDčka pomoci tveho algoritmu... Tohle musí probíhat za letu...

----------
Harvie's blog: [link] g33k-shop: [link] fs: [link]
Registered GNU/LINUX user #468114 [link]

(odpovědět)
Harvie | E-mail | Website | ICQ 2837829784.1.2008 15:40
re: parsovanie v C++#
No asi z pohodlnosti - pak totiž nemá jistotu, že mu hledaný string bude celý v bufferu - že nebude rozdělen mezi dvěma bloky (několik znaků na konci jednoho a zbytek na začátku druhého) - musel by to ošetřit složitěji...
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*4.1.2008 15:55
re: parsovanie v C++#
No, kdyz uz si mam rypnout este jednou... ;P

Tak bych vsechna data radku po radce nacital do bufferu a ve chvili, kdy bych narazil na radku co zacina na "\r\n" bych zacal data nacitat byte po bytu (nebo po vic bytech) do ciloveho souboru...
(odpovědět)
Harvie. | 213.220.241.*5.1.2008 1:35
re: parsovanie v C++#
A jak víš, jak dlouhá bude řádka, kterou chceš načítat?
(odpovědět)
gugumaa | 195.113.79.10/10.0.10.*5.1.2008 9:35
re: parsovanie v C++#
Zase sis musel rypnout. Tohle jsem napsal narychlo z hlavy a chtel jsem prezentovat jen zpusob, kterym to rozparsuji, nikomu nevnucuji, aby to dával do bufferu. To taky neni k zahozeni, pokud chces pracovat s daty o relativne malem objemu, ktere chces hnedka rozparsovat pro dalsi pouziti.
(odpovědět)
nejmenuje | E-mail | Website | ICQ 2600079764.1.2008 21:16

Zpět
Svou ideální brigádu na léto najdete na webu Ideální brigáda
 
 
 

 
BBCode