Forum » Programiranje » [Winsock & C++]HTTP - Prenašanje binarne datoteke - recv()
[Winsock & C++]HTTP - Prenašanje binarne datoteke - recv()
W3by ::
Ker sem še začetnik na tem področju bi prosil za nekaj nasvetov pri prenašanju datoteke preko httpja z winsockom.
V nekem tutorialu sem našel kodo ki sprejema podatke. Za prenašanje teksta dela kar vredu. Potem sem dodal še svojo kodo, ki skopira v buffer dobljene podatke, kjer sem verjetno totalno falil
Torej:
Če prenesem zapakirano datoteko, je ne prenese v celoti in tudi podatki se popolnoma razlikujejo.
Hvala za odgovore!
V nekem tutorialu sem našel kodo ki sprejema podatke. Za prenašanje teksta dela kar vredu. Potem sem dodal še svojo kodo, ki skopira v buffer dobljene podatke, kjer sem verjetno totalno falil
Torej:
while (true) { szBufferRecv = (char *)GlobalAlloc(GPTR, 256); iSprejeto = recv(soket, szBufferRecv, 256, 0); if (iSprejeto==SOCKET_ERROR) break; if (iSprejeto==0) break; // szPrejeto kasneje zapišem v datoteko memcpy(szPrejeto+iSize, szBufferRecv, strlen(szBufferRecv)); iSize += strlen(szBufferRecv); GlobalFree(szBufferRecv); }
Če prenesem zapakirano datoteko, je ne prenese v celoti in tudi podatki se popolnoma razlikujejo.
Hvala za odgovore!
- spremenil: W3by ()
W3by ::
Sem zamenjal, vendar ni spremembe.
Mislim da je problem v memcpy(), ker če izpisujem podatke preko message boxa je vredu, če pa zapišem v fajl, dobim ven samo header.
Kaj bi lahko uporabil namesto memcpy?
Mislim da je problem v memcpy(), ker če izpisujem podatke preko message boxa je vredu, če pa zapišem v fajl, dobim ven samo header.
Kaj bi lahko uporabil namesto memcpy?
Quikee ::
Kak pa zapisujes v file? Upam da odpres file z binary flagom. Drugace pa namesto memcpy lahko uporabi for zanko, ce mislis, da je problem v memcpy.
Aja prej nisem navedel, da strlen ne mores uporabljat za druge stvari kot tekst oz. stringe saj strlen steje znake do prvega "null" (vrednost 0) znaka - kar pa ne mores uporabit pri binarnih datotekah.
Se nekaj lahko poskusis - ne kopiraj v szPrejeto z memcpy ali kakorkoli pac ampak direkt pisi v datoteko szBufferRecv.
Aja prej nisem navedel, da strlen ne mores uporabljat za druge stvari kot tekst oz. stringe saj strlen steje znake do prvega "null" (vrednost 0) znaka - kar pa ne mores uporabit pri binarnih datotekah.
Se nekaj lahko poskusis - ne kopiraj v szPrejeto z memcpy ali kakorkoli pac ampak direkt pisi v datoteko szBufferRecv.
W3by ::
Ok problem je delno rešen. Najprej bi omenil da je bilo krivo pisanje v datoteko - pisal sem z WriteFile(), potem pa sem probal še z fwrite in binary mode in dela.
Kako bi nastavil pri WriteFile binary način, če se seveda da. Drugače bom uporabil kar fwrite.
Še eno vprašanje: kako bi najlažje odstranil header ven?
Kako bi nastavil pri WriteFile binary način, če se seveda da. Drugače bom uporabil kar fwrite.
Še eno vprašanje: kako bi najlažje odstranil header ven?
Quikee ::
Za WriteFile ne vem... mislim, da WriteFile in CreateFile delujeta le binarno. Mors si pogledat na MSDN.
HTTP header pa bi pomoje najlazje odstranil tak, da na zacetku preglejujes buffer dokler ne prides do \r\n\r\n (13 10 13 10) zaporedja znakov. Ko najdes preostanek bufferja zapises v datoteko in postavis flag, da v naslednjem loop-u vec ne preglejujes buffer ampak samo pises v datoteko. Pri tem nacinu je le problem, ce pride zaporedje med loopoma.
HTTP header pa bi pomoje najlazje odstranil tak, da na zacetku preglejujes buffer dokler ne prides do \r\n\r\n (13 10 13 10) zaporedja znakov. Ko najdes preostanek bufferja zapises v datoteko in postavis flag, da v naslednjem loop-u vec ne preglejujes buffer ampak samo pises v datoteko. Pri tem nacinu je le problem, ce pride zaporedje med loopoma.
W3by ::
Hvala za pomoč! Stvar dela odlično, moram tesitirat še mal večje fajle!
Header sem odstranil tako kot si rekel, in mislim da ne bo problemov, ker je večinoma enak (program je namenjen za backup kopije)!
Verjetno bom kar pustil fwrite ker CreateFile & WriteFile delata same probleme
Evo še koda:
Header sem odstranil tako kot si rekel, in mislim da ne bo problemov, ker je večinoma enak (program je namenjen za backup kopije)!
Verjetno bom kar pustil fwrite ker CreateFile & WriteFile delata same probleme
Evo še koda:
while (true){ szBufferRecv = (char *)GlobalAlloc(GPTR, 256); iSprejeto = recv(soket, szBufferRecv, 256, 0); if (iSprejeto==SOCKET_ERROR) break; if (iSprejeto==0) break; header = strstr(szBufferRecv, "\r\n\r\n"); if (iHeader==0 && header != NULL){ iHeader = header - szBufferRecv + 4; for (int j=iHeader; j<(iSprejeto); j++) szPrejeto[j-iHeader] = szBufferRecv[j]; iSize = iSprejeto-iHeader; } else if (iHeader!=0 && header==NULL) { memcpy(szPrejeto+iSize, szBufferRecv, iSprejeto); iSize += iSprejeto; if (iSize>BUFFER) { ZapisiDatoteko((char *)cDatoteka, szPrejeto, iSize, 1); iSize = 0; z++; } GlobalFree(szBufferRecv); } }
Zgodovina sprememb…
- spremenil: W3by ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [baze] Povezava do slike ali BLOB?Oddelek: Programiranje | 1667 (1464) | BlueRunner |
» | [C][linux] socket HTTPOddelek: Programiranje | 1196 (1064) | b |
» | [C/C++] Branje sektorjevOddelek: Programiranje | 1288 (1136) | yeti |
» | C++Oddelek: Programiranje | 1429 (1191) | zdravcc |
» | C++ in komunikacija preko LPT pod NT/W2kOddelek: Programiranje | 1150 (963) | Turbina |