JPG über sockets!
-
Server:
#include <windows.h> #include <iostream> #include <vector> #include <fstream> using namespace std; int main() { WSADATA wsa; SOCKADDR_IN addr; int rc; SOCKET acceptSocket, connectedSocket; if(WSAStartup(MAKEWORD(2,0), &wsa) != 0) { cout << "Socket konnte nicht gestartet werden" << endl; } acceptSocket = socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { cout << "Socket konnte nicht erstellt werden" << endl; } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(40791); addr.sin_addr.s_addr=INADDR_ANY; if(bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { cout << "Socket konnte nicht gebindet werden" << endl; } if(listen(acceptSocket,10)==SOCKET_ERROR) { cout << "listen ist fehlgeschlagen" << endl; } connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { cout << "Socket konnte nicht akzeptiert werden" << endl; } size_t length; recv(connectedSocket, (char *)&length, sizeof(length), 0); vector<char> buffer( length ); cout << length << endl; recv(connectedSocket, &buffer[0], length, 0); int i = 0; ofstream Zieldatei("tmp.jpg"); if (!Zieldatei) // Fehler beim Öffnen? cerr << "Ausgabe-Datei kann nicht geöffnet werden\n"; else { // falls es funktioniert hat while(i != length) Zieldatei.put(buffer[i]); cout << "erfolgreicht" << endl; } system("PAUSE"); return 0; }Client ausschnitt
ifstream file( "tmp.jpg", ios::binary ); // Dateigröße ermitteln file.seekg( 0, ios::end ); size_t length = file.tellg(); file.seekg( 0, ios::beg ); // in Buffer einlesen vector<char> buffer( length ); file.read( &buffer[0], length ); // und ab damit cout << length << endl; send( s, (const char*)&length, sizeof(length), 0 ); Sleep(1000); send( s, &buffer[0], length, 0 );verdammt was mach ich nur falsch

manchmal gibt der server gar nicht erfolgreich aus aber der Client ist schon wieder abgeschlossen und manchmal klappt es aber bei der datei kommt immer fehler bei der vorschau zum anschaun OO
-
Das könnte daran liegen, dass recv nicht unbedingt immer alle Daten empfängt. Überprüf doch mal den Return-Wert von recv und du brauchst wohl eine Schleife, die solange empfängt, bis die Daten da sind. Oder auch 'ne Hilfsfunktion, die ungefähr so aussieht:
bool RecvData( SOCKET s, char* data, size_t bytes ) { size_t bytes_read = 0; while ( bytes_read != bytes ) { int r = recv( s, data+bytes_read, bytes-bytes_read, 0 ); // Grad keine Daten zum empfangen da? if ( r==-1 && WSAGetLastError()==WSAEWOULDBLOCK ) Sleep( 20 ); // Fehler bzw Verbindung geschlossen? else if ( r <= 0 ) return false; else bytes_read += r; } return true; }edit: Der Code ist ungetestet. Und recv kann halt z.B. beim ersten Aufruf nur 5 Bytes empfangen, beim zweiten noch ein paar und beim dritten den Rest. Oder so, jedenfalls wartet es nicht, bis man die angegebene Anzahl an Bytes empfangen hat.
-
danke

jetzt wird die jpg jedes mal erstellt aber sie hat zirka 15 mb und kann nicht angezeigt werden
#include <windows.h> #include <iostream> #include <vector> #include <fstream> using namespace std; char* RecvData( SOCKET s, size_t bytes ); int main() { WSADATA wsa; SOCKADDR_IN addr; int rc; SOCKET acceptSocket, connectedSocket; if(WSAStartup(MAKEWORD(2,0), &wsa) != 0) { cout << "Socket konnte nicht gestartet werden" << endl; } acceptSocket = socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { cout << "Socket konnte nicht erstellt werden" << endl; } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(40791); addr.sin_addr.s_addr=INADDR_ANY; if(bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { cout << "Socket konnte nicht gebindet werden" << endl; } if(listen(acceptSocket,10)==SOCKET_ERROR) { cout << "listen ist fehlgeschlagen" << endl; } connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { cout << "Socket konnte nicht akzeptiert werden" << endl; } size_t length; recv(connectedSocket, (char *)&length, sizeof(length), 0); cout << length << endl; char *buffer = RecvData(connectedSocket, length); int i = 0; ofstream Zieldatei("tmp.jpg"); if (!Zieldatei) // Fehler beim Öffnen? cerr << "Ausgabe-Datei kann nicht geöffnet werden\n"; else { // falls es funktioniert hat while(i != length) Zieldatei.put(buffer[i]); cout << "erfolgreicht" << endl; } system("PAUSE"); return 0; } char* RecvData( SOCKET s, size_t bytes ) { size_t bytes_read = 0; static char tempBuff[1000000]; while ( bytes_read != bytes ) { int r = recv( s, tempBuff+bytes_read, bytes-bytes_read, 0 ); // Grad keine Daten zum empfangen da? if ( r==-1 && WSAGetLastError()==WSAEWOULDBLOCK ) Sleep( 20 ); // Fehler bzw Verbindung geschlossen? else if ( r <= 0 ) return false; else bytes_read += r; } return tempBuff; }
-
Also das mit dem tempBuff in RecvData ist aber ein bisschen dreckig
Was gibt der Server denn bei cout << length << endl;aus?
-
genau das gleiche wie der Client.
Also immer so 2 kb mehr wie die dateigröße von jpg.
-
Also immer so 2 kb mehr wie die dateigröße von jpg.
Es sollten aber eigentlich nur 4 Bytes mehr sein
Zieldatei.put(buffer[i]);=>Zieldatei.put(buffer[i++]);?
Bzw
ofstream Zieldatei( "tmp.jpg", ios::binary ); // Wichtig, das "binary" nicht vergessen! ... Zieldatei.write( buffer, length );
-
upsi, da hab ich wohl das ++ vergessen *schäm*
jetzt kommen wir der sache schon verdammt nahe!
Die datei aht ne normale größe und kann angezeigt werden.
Aber wenn ich sie öffne erstehen solche bilder:
http://img224.imageshack.us/my.php?image=tmpsm1.jpg
(soll ein screen vom desktop sein)
-
Na also, fast!

Hast du auch das ios::binary zum ofstream hinzugefügt? Und wie sehen die Dateigrößen aus, sind sie gleich? Ansonsten kannst du sie mal im Visual Studio binär öffnen und nach Unterschieden suchen, vielleicht fällt dir was auf.
-
sry hatte vorhin das mit binary übersehen.
juhuuu es geht jetzt endlich

du bist der beste
1000 mal danke
-
Hehe, gerne! Freut mich, dass ich helfen konnte

-
mist, wollte jetzt statt jpg auch bmps verschicken aber das programm stürzt ab!
#include <windows.h> #include <iostream> #include <vector> #include <fstream> using namespace std; char* RecvData( SOCKET s, size_t bytes ); int main() { WSADATA wsa; SOCKADDR_IN addr; int rc; SOCKET acceptSocket, connectedSocket; if(WSAStartup(MAKEWORD(2,0), &wsa) != 0) { cout << "Socket konnte nicht gestartet werden" << endl; } acceptSocket = socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { cout << "Socket konnte nicht erstellt werden" << endl; } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(40791); addr.sin_addr.s_addr=INADDR_ANY; if(bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { cout << "Socket konnte nicht gebindet werden" << endl; } if(listen(acceptSocket,10)==SOCKET_ERROR) { cout << "listen ist fehlgeschlagen" << endl; } connectedSocket=accept(acceptSocket,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { cout << "Socket konnte nicht akzeptiert werden" << endl; } size_t length; recv(connectedSocket, (char *)&length, sizeof(length), 0); cout << length << endl; char *buffer = RecvData(connectedSocket, length); ofstream Zieldatei("tmp.bmp", ios::binary); int i = 0; if (!Zieldatei) // Fehler beim Öffnen? cerr << "Ausgabe-Datei kann nicht geöffnet werden\n"; else { // falls es funktioniert hat while(i != length) Zieldatei.put(buffer[i++]); // hier stürtzt es ab, genauso mit write } Zieldatei.close(); system("PAUSE"); return 0; } char* RecvData( SOCKET s, size_t bytes ) { size_t bytes_read = 0; static char tempBuff[100000]; while ( bytes_read != bytes ) { int r = recv( s, tempBuff+bytes_read, bytes-bytes_read, 0 ); // Grad keine Daten zum empfangen da? if ( r==-1 && WSAGetLastError()==WSAEWOULDBLOCK ) Sleep( 20 ); // Fehler bzw Verbindung geschlossen? else if ( r <= 0 ) return false; else bytes_read += r; } return tempBuff; }
-
Eventuell platzt dein static Puffer aus RecvData?