Winsock, przesyłanie plików

0

Witam, to znowu ja...

Chciałbym przesłać plik jpg używając własnego programu. Czytając różne fora i poradniki wyodrębniłem listę kroków:
(klient)

  1. Otwieram plik w trybie binarnym (std::binary)
  2. Dzielę plik na części.
  3. Wysyłam każdą część.
    (serwer)
  4. Otrzymuję dane.
  5. Zapisuję do pliku binarnego.

Niestety, mimo że robię wszystkie kroki przesłany przeze mnie plik jpg utracił obraz (pisze: nieprawidłowy format), a plik exe stracił możliwość uruchamiania się. Wychodzi, że robię coś nie tak. Czy ktoś mógłby napisać coś w stylu krótkiego tutoriala? Wystarczy zwykły kod z komentarzami żebym mógł porównać go ze swoim rozwiązaniem.

Z góry dzięki za pomoc :)

0

może wyślij cały plik nie dzieląc go na części ?

0

Jak masz jakiś problem to zawsze podawaj kod, więc wklej go tu i zobaczymy co jest nie tak.

0

Ja tam sądzę, że nie ma żadnego błędu bo nie ma żadnego kodu. Na innym forum podpowiedzieli autorowi tematu algorytm ale i tak nie potrafi go zaimplementować. No ale mogę się mylić...

0
several napisał(a)

Ja tam sądzę, że nie ma żadnego błędu bo nie ma żadnego kodu. Na innym forum podpowiedzieli autorowi tematu algorytm ale i tak nie potrafi go zaimplementować. No ale mogę się mylić...

No i mylisz się. Kod jest, ale szczerze mówiąc to się go wstydzę. Przesyłanie plików jest przez wszystkich tłumaczone jako oczywistość, a ja mam z tym problem, no ale proszę.

Kod do wysyłania (pomijam wszystkie łączenia z socketem, makroinstrukcje, itp. bo kod się kompiluje), pętla for była używana wcześniej (zamieniałem znak char na string który reprezentował jego bity, np. 00110011 i przesyłałem każdy znak pojedyńczo):

std::ifstream plik;
plik.open(FILE, std::ios::binary);
		
if (plik.is_open() == false)
{
	std::cout << "\n>> Opening file error!";
	_getch();
	return(1);
}
		
while (!plik.eof())
{
	std::string line;
	std::getline(plik, line);
	
	if (line.length() > 0)
	{
        	for (unsigned i = 0; i < line.length(); i++)
		{
			bool bDone = false;
			while (!bDone)
			{
				int bytes = send(sock, &line[i], BUFOR, NULL);
				if (bytes > 0)
				{
					std::cout << "\n>> Message (" << bytes << " bytes) sent!";
					bDone = true;
				}
				else if (bytes < 0) std::cout << "\n>> Data sending error: " << WSAGetLastError();
				else 
				{
							std::cout << "\n>> Connection lost!";
							bDone = true;
				}
			}//end: while
		}//end: for
	}//end: if
}//end: while (eof)
plik.close();			

Kod odbierania (po stronie serwera):

char msg[BUFOR];
std::string txt;				
bool bDone = false;
while (!bDone)
{
	int bytes = recv(client, msg, BUFOR, NULL); 
	if (bytes > 0) 
	{
		std::cout << msg;
		txt += msg;
	}
	else if (bytes < 0) std::cout << "\n>> Error: " << WSAGetLastError();
	else 
	{
	        std::cout << "\n>> User disconnected!";
                bDone = true;
	}
}
				
std::ofstream plik(FILE, std::ios::ate | std::ios::binary);
if (plik.is_open() == true)
{
	plik << txt;
	plik.close();
}
else std::cout << "\n>> Opening file error!";

EDIT:
Aj, aj... Już nieważne, działa. Przeczytałem tutorial na stronie www.cpp0x.pl i dowiedziałem się, że traktowanie pliku, nawet otwartego w trybie binarnym, jako strumień powoduje odczytanie i zapis jako tekst... Użyłem write() i read() i jest ok...

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