JPG über sockets!
-
hallo,
ich habe eine verbindung über sockets aufgebaut.
Wie kann ich jetzt eine datei genauer ein .jpg versenden?
Ich weiß mit send kann ich text versenden. aber wie eine datei?
Danke
-
dateien versenden schrieb:
Ich weiß mit send kann ich text versenden. aber wie eine datei?
Wo kommt das eigentlich immer her, dass man mit send nur Text verschicken könnte!? Mit send kannst du verschicken was du willst, also einfach Datei in den Speicher laden (komplett oder blockweise) und wegschicken.
-
ja das ist mir klar nur wie kann ich die datei laden?
Einfach den Pfad angeben bei send?
-
lol
-
öhm könnt ihr euch nur über anfänger lustig machen?
Ich hab halt noch nicht so viel Erfahrung wie ihr tut mir leid...
-
dann lies ein buch über die grundlagen der c programmierung und komm dann wieder.
-
-.- ich weiß selber das es totaler blödsinn ist einfach den Pfad anzugeben. Das wäre ja so als ob ich text versenden würde! Nur wie kann ich das in den Speicher laden?
-
asdca schrieb:
dann lies ein buch über die grundlagen der c programmierung und komm dann wieder.
fopen, fseek, fread, fwrite, fclose. CreateFile, ReadFile, CloseHandle.
Wir sind hier kein Kindergarten.

-
so?
ifstream file;
file.open(".jpg",ios::in|ios::binary);send(s,file,sizeof(file),0);
file.close();
-
was soll das für schrott sein? das sieht voll hässlich aus, hier ist Winapi und kein schrott c++ forum.
-
FILE * pFile; long lSize; char * buffer; size_t result; pFile = fopen ( "myfile.bin" , "rb" ); if (pFile==NULL) {fputs ("File error",stderr); exit (1);} // obtain file size: fseek (pFile , 0 , SEEK_END); lSize = ftell (pFile); rewind (pFile); // allocate memory to contain the whole file: buffer = (char*) malloc (sizeof(char)*lSize); if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} // copy the file into the buffer: result = fread (buffer,1,lSize,pFile); if (result != lSize) {fputs ("Reading error",stderr); exit (3);} /* the whole file is now loaded in the memory buffer. */ // buffer hier jetzt noch über send verschicken und fertig? // enthält buffer die ganze datei oder muss ich mehrere teile schicken? // terminate fclose (pFile); free (buffer);
-
und wie kann ich dann aus dem empfangegen buffer wieder eine datei erstellen?
-
asdca schrieb:
hier ist Winapi und kein schrott c++ forum.
Ob der Thread-Ersteller C oder C++ programmieren will, sei ihm immer noch freigestellt.
omg schrieb:
so?
ifstream file;
file.open(".jpg",ios::in|ios::binary);send(s,file,sizeof(file),0);
file.close();Fast

ifstream file( "bla.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 send( s, &buffer[0], length, 0 );
-
omg schrieb:
und wie kann ich dann aus dem empfangegen buffer wieder eine datei erstellen?
Dazu musst du natürlich vorher mitschicken, wie groß die Datei ist, also beim Senden noch
send( s, &length, sizeof(length), 0 );.
Beim Empfangen halt erst die Länge der Datei empfangen (sizeof(length), sizeof(length) muss aber bei Empfänger und Sender gleich sein!) und dann solange empfangen, bis die Datei komplett da ist (eben bis 'length' Bytes gelesen sind).edit: Programmierst du eigentlich mit C oder mit C++?
-
vielen vielen dank Badestrand!! ich programmiere C++.
Aber wenn ich jetzt die bytes empfangen habe muss ich ja auch irgendwie die Datei wieder erstellen am Empfänger also das Bild.
Und noch ne Frage: da steht binary bei fopen.
Gehen da trotzdem bilder?
-
omg schrieb:
vielen vielen dank Badestrand!! ich programmiere C++.
Das ist gut
Du könntest dir auch mal SFML anschauen, damit ist das Socket-Handling um einiges einfacher.omg schrieb:
Aber wenn ich jetzt die bytes empfangen habe muss ich ja auch irgendwie die Datei wieder erstellen am Empfänger also das Bild.
Genau, einfach mit
ofstreameine schreibende Datei mit Endung ".jpg" erzeugen/öffnen und den Dateiinhalt reinschreiben. Dann kannst du sie ganz normal im Explorer öffnen.omg schrieb:
Und noch ne Frage: da steht binary bei fopen.
Gehen da trotzdem bilder?Ja klar, "binary" ist allumfassend, alle Daten sind binär. Textdaten oder Bilddaten sind auch binär, werden aber besonders dargestellt (eben als Text/Bild), weil sie vom Computer erst nach bestimmten Standards (siehe Dateiformat von Jpegs oder ASCII-Format) interpretiert werden.
-
ok danke
send( s, &length, sizeof(length), 0 );
konvertierung des 2 paramteter von size_t in char nicht möglich oO
-
Evtl.
send( s, static_cast<const char*>(&length), sizeof(length), 0 );?
-
soweit bin ich schon:
Server#include <windows.h> #include <iostream> 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); cout << length << endl; system("PAUSE"); return 0; }Client:
int main() { SOCKET s; WSADATA wsa; SOCKADDR_IN addr; int rc; if(WSAStartup(MAKEWORD(2, 0), &wsa) != 0) { cout << "Winsock konnte nicht gestartet werden" << endl; } s = socket(AF_INET, SOCK_STREAM, 0); if(s == INVALID_SOCKET) { cout << "Socket konnte nicht erstellt werden" << endl; } memset(&addr, 0, sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family = AF_INET; addr.sin_port = htons(40791); // wir verwenden mal port 40791 rc = getAddrFromString(TEXT("ip"), &addr); if(rc == SOCKET_ERROR) { cout << "IP konnte nicht aufgelöst werden" << endl; } if(connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR)) == SOCKET_ERROR) { cout << "Konnte nicht verbinden" << endl; } 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 send( s, (const char*)length, sizeof(length), 0 ); [cpp]leider gibt der Server immer 7143525 aus, egal wie groß die datei ist.
Woran kann das liegen?
-
&