» »

[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:
	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 ()

Quikee ::

zamenjaj vse strlen(szBufferRecv) z iSprejeto

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?

64202 ::

Daj celo kodo
I am NaN, I am a free man!

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.

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?

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.

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

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[baze] Povezava do slike ali BLOB?

Oddelek: Programiranje
101658 (1455) BlueRunner
»

[C][linux] socket HTTP

Oddelek: Programiranje
101186 (1054) b
»

[C/C++] Branje sektorjev

Oddelek: Programiranje
51280 (1128) yeti
»

C++

Oddelek: Programiranje
71416 (1178) zdravcc
»

C++ in komunikacija preko LPT pod NT/W2k

Oddelek: Programiranje
101137 (950) Turbina

Več podobnih tem