.bmp senden über Winsocks
-
Hey,
ich möchte über eine Winsockverbindung eine .bmp datei senden. Ist das möglich?Gruß
Chrises
-
Hallo.
Ja.
Bye.
-
Erstma danke für die Antwort

Wie genau muss ich da vorgehen? Gibt es eine Funktion die es möglich macht ganze Daten zu versenden oder muss man die Datei Stück für Stück rüber schicken und dann wieder zusammen bauen?
-
Probier doch einfach aus, wieviel send() auf einmal annimmt. Du musst doch so oder so prüfen, ob alles gesendet worden ist.
-
Ich hab mal eine Exe über WinSocks verschickt( müsste mit einer bmp Datei genau so gehen ) da musste man dann die bytes der Exe auslesen und diese kann man dann versenden.
Bytes lesen:
http://www.cplusplus.com/reference/iostream/istream/read/Nach dem du die Bytes dann an den Server gesendet hast musst du mit ofstream eine Datei erstellst mit der Endung bmp.
Mit write schreibst du die Empfangene Bytes dann einfach in die Datei.
write
http://www.cplusplus.com/reference/iostream/ostream/write/
So ging es meine ich.
-
Also habs jetzt ma ausprobiert.. bekomme es aber nicht so wirklich hin

char * buffer; long size; ifstream infile ("C:\\new.bmp", ifstream::binary); infile.seekg(0,ifstream::end); size=infile.tellg(); infile.seekg(0); buffer = new char [size]; infile.read (buffer,size); //Hier kommt dann die Fehlermeldung :/ const char* c = (const char*)size; //ka ob das wirklich funktioniert.. soweit bin ich ja noch nicht gekommen :P send(s, buffer, sizeof(buffer), 0); send(s, c, sizeof(size), 0); delete[] buffer; infile.close();Fehlermeldung:
Debug Error!
Program:
...(Pfad zur .exe)Invalid allocation size: 4294967295 bytes.
(Press Retry to debug the application)
Ist die Datei zu groß(hat grade mal 3,001kb) oder hab ich einfach nen Fehler im Code?
-
Hatte das selbe Problem, nur weiß ich nicht wie ich es damals gelöst habe.
-
Mit der Grösse der Datei sollte es eigentlich keine Probleme geben.
Allerdings ist sizeof(buffer) == 4 und nicht gleich size!!
Edit
Ausserdem solltest Du die Adresse von size übergeben (const char* c = (const char*)&size;) nicht den Wert selbst.Ich schätze Du solltest für size eher unsignd long anstelle von long benutzen.
Simon
-
Wenn die Datei nicht geöffnet wurde, gibt dir tellg() -1 zurück (4294967295).
Also zuerst mit file.is_open() checken.Und statt sizeof(buffer) (Größe eines Zeigers!) verwende deine Variable 'size'.
-
Also den Code benutze ich zum Senden.
char * buffer; unsigned long size; ifstream infile; infile.open("C:\\neu.bmp", ifstream::binary); if(!infile.is_open()) MessageBox(0, "Fehler beim öffnen der Datei", "Fehler", MB_OK); // get size of file infile.seekg(0,ifstream::end); size=infile.tellg(); infile.seekg(0); // allocate memory for file content buffer = new char [size]; // read content of infile infile.read (buffer,size); // buffer = 0x016b0040 "BM6à." // size = 3072054 int i; const char* c = (const char*)&size; // c ist nun 0x001af59c "6à." i=send(s, buffer, sizeof(size), 0); if(i==SOCKET_ERROR) MessageBox(0, "Fehler bei Send1", "Fehler", MB_OK); i=send(s, c, sizeof(c), 0); if(i==SOCKET_ERROR) MessageBox(0, "Fehler bei Send2", "Fehler", MB_OK);Das Empfangen macht mir aber auch noch einige Schwirigkeiten :/.
char cSize[4096]; char buffer[4096]; unsigned long Size; rc=recv(connectedSocket, cSize, strlen(cSize), 0); // cSize = 0x002aebdc "BM6à" if(rc==SOCKET_ERROR) cout << " recv1 failed" << endl; cSize[rc] = '\0'; Size = (unsigned long)cSize; //Size = 2812892 rc=recv(connectedSocket, Buffer,strlen(Buffer),0); //ProgrammBuffer = 0x002adc54 "6à." if(rc==SOCKET_ERROR) cout << " recv2 failed" << endl; ProgrammBuffer[rc] = '\0'; ofstream outfile ("Neu.bmp",ofstream::binary); //X* outfile.write(ProgrammBuffer, Size); outfile.close();Wenn der Client X* erreicht bekomme ich folgende Fehlermeldung:
Unbehandelte Ausnahme bei 0x5e80edc8 (msvcr90d.dll) in Client.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x002bd000.
Liegt das Problem beim Sender oder beim Empfänger?
-
Client:
1. Benutze nicht strlen(..) sondern eben eine Konstante.
2. recv(..) empfängt nicht zwingenderweise alle daten auf einmal. D.h. du sollst zuerst recv(..) mit einem buffer der grösse 4 aufrufen und solange den return wert überprüfen bis eben 4 bytes empfangen sind (in einer schleife). Dann das selbe mit der übermittelten Länge.
3. Die Null Terminierungsgeschichten kannst Du dir sparen. Es geht um Daten, nicht (C-) Strings.Server:
1. Sende erst die Länge der Datei, dann den Inhalt der Datei. Halt so wie es auf Client Seite gebraucht wird.
2. Beim senden des Inhalts musst Du nicht sizeof(size) angeben, sondern eben size!!Als Tip für die Daten: Du könntest auch einen std::vector nehmen, ist einfach in der Handhabung.
Das sind jetzt mal die gröbsten Fehler die mir gerade aufgefallen sind.. wahrscheinlich gibts noch mehr.
Simon
Edit
Liegt das Problem beim Sender oder beim Empfänger?
Bei beiden... :p