Socket, ściąganie plików i niechciane znaki nowej lini.

0

Piszę sobie klienta HTTP no i mam taki problem, że nie wiem czemu do plików, które ściągam dodają mi się znaki nowej linii. Przykładowo, strona główna 4programmers.net powinna mieć 502 linie, mój program ściąga 939.
Kod:

DWORD WINAPI HTMLGetToFile(LPVOID param)
{
	ofstream fs("D:\\plik.html");
	SOCKET sock = (SOCKET)param;
	const int BUFF_SIZE = 4096;
	char buffor[BUFF_SIZE];
	int bytesRecvd = 0;
	int allBytes = 0;

	if(fs.is_open())
		cout << "File opened\n";

	while(true)
	{
		bytesRecvd = recv(sock, buffor, BUFF_SIZE, 0);
		if(bytesRecvd > 0)
		{
			for(int i = 0; i < bytesRecvd; i++)
			{
				fs.put(buffor[i]);
			}
			
			allBytes += bytesRecvd;
		}
		else if(bytesRecvd == 0)
		{
			cout << "Razem odebrano : " << allBytes << " bajtow" << endl;
			fs.close();
			break;
		}

		Sleep(15);
	}

	return 0;
}

Na razie ten kod wygląda jak wygląda, ale dlaczego się tak robi?

0

Taki juz jest protokol HTTP, co poradzisz.
Na koncu linijki masz przewaznie znak powrotu karetki i nowej linii.

0

Ale jeśli mi w Firefoxie wyświetla dobrze to dlaczego nie może mój program dobrze tego robić? :(

0

A w ogóle to na ekranie (cout) wyświetla mi się wszystko jak należy.

0
ytrewq napisał(a)

Ale jeśli mi w Firefoxie wyświetla dobrze to dlaczego nie może mój program dobrze tego robić? :(

Ponieważ parsowanie HTML to ogromnie dużo roboty.

Dodatkowe linie w HTML nie mają znaczenia.

0

Chodzi mi o źródła, nie parsowanie.
A w ogóle to mi nie chodzi o HTML tylko o pliki binarne, bo ten program takie ma ściągać, a exeka czy pdfa, w którym jest tak pomieszane nie otworze.

0

A w ogóle to na ekranie (cout) wyświetla mi się wszystko jak należy.

Bo być może strumień poprawnie parsuje ciąg "\r\n" jako pojedynczy koniec linii.

btw, całą pętle można skrócic do:

while((bytesRecvd = recv(sock, buffor, BUFF_SIZE, 0)) > 0 && fs.write(buffor,bytesRecvd))
{
	allBytes += bytesRecvd;
}
0

Próbowałem pomijać '\r' ale to też nie to.

0

No ale w czym problem, przecież sam napisałeś, że zawartość wyświetlona w konsoli wygląda poprawnie?

0

Ale kiedy zapisuję do pliku jest źle. A to właśnie o zapisywanie do pliku chodzi.
Przekierowanie cout do pliku nie pomogło.

0

Spróbuj ze strumieniem binarnym.

0

Panie, kochany, dzięki panu!
Przeca ja cały czas myślałem, że otwieram ten strumień z flagą ios::binary....
Do zamknięcia!.

1 użytkowników online, w tym zalogowanych: 0, gości: 1