transfer plików - "podział/doładowywanie binarki"

0

Witam, jeśli chodzi o takie sprawy jak znajomość komunikacji pomiędzy serwer - klient jak najbardziej mam. Problem w tym, że nie wiem jak podzielić plik na binarke lub bajty gdzię bede dzielic po 512 bajtów i wysyłać do klienta, który utworzy plik i będzie ten plik aktualizował, czyli "doładowywał" jego kolejne partie pamięci. Zamierzam zrobić to na protokole UDP, gdzie bede co sekunde wysyłał pakiety i odbierał sumę kontrolną czy wszystko dotarło w najlepszym porządku.

Ja jedynie dowiedziec sie chce jak wlasnie owy plik podzielic (pobrac ilosc bajtow), zas systemem sprawdzania przesylanych pakietow juz sie zajme.

0

A czemu chcesz co sekundę wysyłać pakiety? Wysłanie jakiegoś racjonalnego pliku zajmie Ci szmat czasu. Podział pliku nie jest czynnością skomplikowaną, robisz najzwyczajniejszą w świecie pętle która wysyła zadany pakiet. Jeśli zamierzasz wysyłać po 512 bajtów to dzielisz rozmiar pliku przez 512 i już masz ilość iteracji, w pętli natomiast przeskakujesz odpowiednio po buforze (jeśli trzymasz cały plik w pamięci) bądź używasz seekg() jeśli jednorazowo trzymasz w pamięci tylko jeden pakiet i cała filozofia.

0

Okej rozumiem, z tą pętlą dobre rozwiązanie. No wszystko fajnie pięknie, ale co na to ten co odbiera te pakiety (a dokładniej plik), jak on ma dodawać tą pamięć do nowo utworzonego pliku (jeszcze nie w pełni użytku) po odbiorze powiedzmy sobie tych 512 bajtów? Jakieś funkcje czy cosik?

0

Moje pytanie brzmi - a dlaczego chcesz to robić przez UDP i sprawdzać czy pakiet dotarł - skoro TCP może zrobić to za Ciebie? Nie wynajdujesz czasami koła na nowo?

0

Mam taką chęć po prostu. To jakie funkcje by się przydały ?

0

bez sensu, lepiej w takim wypadku użyć tcp/ip, udp używa się głównie do wysyłania jakiś danych na żywo typu dźwięk, gdzie nic się nie stanie jak jakiś pakiet nie dotrze

0
xyzq napisał(a)

Okej rozumiem, z tą pętlą dobre rozwiązanie. No wszystko fajnie pięknie, ale co na to ten co odbiera te pakiety (a dokładniej plik), jak on ma dodawać tą pamięć do nowo utworzonego pliku (jeszcze nie w pełni użytku) po odbiorze powiedzmy sobie tych 512 bajtów? Jakieś funkcje czy cosik?

Pętla po stronie odbierającego jest jeszcze prostsza niż po stronie wysyłającego. Wszystko wysyłasz i obierasz funkcjami send() i recv(), z winsocka. Popatrz co zwracają i użyj tych wartości.
Jeśli chcesz odebrany plik trzymać w całości w pamięci użyj vectora z STL, on sam zadba o swój rozmiar. Możesz też na bieżąco zapisywać pliki na dysku używając seekp(). Aaa, i użyj TCP, nie zrobisz sprawdzania błędów ani lepiej ani wydajniej niż autorzy interfejsu socketowego.

0

Mi bardziej chodzi o przesyłanie plików każdego rodzaju, np. dll,mp3,exe itp.

1
xyzq napisał(a)

Mi bardziej chodzi o przesyłanie plików każdego rodzaju, np. dll,mp3,exe itp.

No to żeś do#$%ał do pieca nie ma co.

0

TCP/IP przy użyciu np. Winsocka, który jest bardzo intuicyjny oraz łatwy w opanowaniu i jedziesz z koksem :D Nie ma sensu bawić się w jakieś udp czy inne badziewia gdy masz gotowe rozwiązania na wyciągnięcie ręki ;) Z resztą several Ci już to bardzo ładnie opisał po krótce :)

0

Ahhhh lol ze mnie, dla każdego rozszerzenia mogę utworzyć bufor...

0

Mam wrażenie, że nie wiesz, co chcesz zrobić

0

Czy wy nie widzicie ze to prowokacja? Ludzie AZ tacy glupi nie sa.

0

Prowokacja? Wtf? Wracając do tematu, to mi chodzi o pobranie buforu z jakiegokolwiek pliku. W tym buforze będą znajdować się przeróżne krzaky itp i zapisując je na koniec pliku (seekp - dzięki) u drugiego klienta uzyskam plik/aplikacje zdolną do użytku. Czy moja teza jest zgodna z prawem plików/pamięci? Jest pewien problem, gdyż zapisuje coś do pliku to tego tekstu nie widać jawnie, lecz kiedy pobiorę z niego bufor to rzeczywiście zapisał się ten wcześniej zapisany tekst. Podejrzewam, że to ma coś wspólnego z ios::binary, lecz tego nie używałem.. A rozmiar pliku W OGÓLE się nie zmienia o dziwo, nawet jeżeli umieszczę w pliku 1 megabajtowy bufor. Poradźcie coś.

0

Pokaż kod, inaczej się nie dogadamy.

0

Jeżeli przesyłasz pliki binarne (*.dll czy *.exe chociażby) to używaj ios::binary i metody read().

0
fstream fs;
	fs.open("rum.txt",ios::in | ios::out);
	if(fs.good() == true)
	{
		fs.write("no to testujem",15);
		fs.close();

		fs.open("rum.txt",ios::in | ios::out);
		char tp[20];
		ZeroMemory(tp,20);
		fs.read(tp,20);
		fs.close();
		cout << tp;
		Beep(100,100);
	}
 

W pliku "rum.txt" wpisałem ręcznie "blablablablabla". Wykonanie tego kodu powoduje chyba zapis ios::binary i po wyświetleniu mam tekst "no to testujem", lecz w pliku tekstowym widnieje napis "blablablabla". Nie rozumiem dlaczego taka sytuacja zaistniała. A jeżeli umieszcze ogromny bufor to plik nie zmienia swojego rozmiaru - cholernie dziwne.

0

Jeżeli przesyłasz pliki binarne (*.dll czy *.exe chociażby) to używaj ios::binary i metody read().

To w plikach testowych mam używać przesunięć bitowych, a w takich "niedostępnych" binary i read. Aha no zobacze.

0

Ohh dopuszczam się grzechów - double posty. Sory, przesunięcia bitowe robią to samo..

0

Masz i nie wracaj ;p

#define net_send(socket,buf,buflen) send(socket,buf,buflen,0)
#define net_read(socket,buf,buflen) recv(socket,buf,buflen,0)
 

Wysyłający:

if(nFileSize<=512)
	{
		char *cFileBuf=new char[nFileSize];
		//file.seekg(0, ios::beg);
		file.read(cFileBuf, nFileSize);
		int nSend=net_send(nData, cFileBuf, nFileSize);
		if(nSend>0){                                    
			cout<<"Write succeded. Wrote: "<<nSend<<"bytes"<<endl;
			nRet=1;}
			
		else{
			cout<<"Write failed"<<endl;
			nRet=0;}
		delete[]cFileBuf;
	}
	else
	{
		int itNumber=(nFileSize/512)+1;
		for(int i=0;i<itNumber;i++)
		{
			
			file.seekg((i*512),ios::beg);
			if(nFileSize-(i*512)>=512)
			{
				char buf[512];
				file.read(buf,512);
				net_send(nData,buf,512);
			}
			else
			{
				int x=i*512;
				int j=0;
				char chr[1];
				vector<char> vecBuf;
				while(x<=nFileSize)
				{
					file.seekg(x,ios::beg);
					file.read(chr,1);
					vecBuf.push_back(chr[0]);
					++x;
					++j;
				}
				char *buf=new char[j];
				for(int i=0;i<j;i++)
				{
					buf[i]=vecBuf[i];
				}
				net_send(nData,buf,j);
				delete[] buf;
			}


		}
	}
 

W powyższym kodzie użycie vectora jest niepotrzebne, coś tam pewnie można jeszcze zoptymalizować ale nie chce mi się tego poprawiać.
Odbierający:

 
int nRec;
	ofstream file;
	file.open(csFileName, ios::out | ios::binary);
	for(;;)
	{
		char temp[512];
		nRec=net_read(nData, temp, 512);
		char *cFileBuf=new char[nRec];
		if(nRec<0)
		{
			//for(int i=0;i<1024;i++){cout<<cFileBuf[i];}
			DataTranReply(PRINT);
			//cout<<"Data read error"<<endl;
			delete[]cFileBuf;
			//cout<<ftpHandle->DataHandle.nDataSock<<endl;
			ftpHandle->DataHandle.nDataSock=0;
			return 0;
		}
		else
		{
			for(int i=0;i<nRec;i++){cFileBuf[i]=temp[i];}
			file.seekp(0,ios::end);
			file.write(cFileBuf,nRec);
			delete[] cFileBuf;
			
			//cout<<"Get succeded. Got: "<<nRec<<"bytes"<<endl;
		}
	}
0

No ok dzięki, ale co poradzić na to, że nie czyta mi treści z pliku, tylko tą ukrytą - nie jawną ;/

0

Już jest ok, po prostu pliki znajdujące się w tym samym katalogu co moja aplikacja były źle interpretowane. Do zamknięcia :)

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