ERLEDIGT
JA
JA
ANTWORTEN
3
3
ZUGRIFFE
192
192
EMPFEHLEN
-
Hallo C - Guru's

Ich programmiere mit Sockets und möchte nun ein Bild (.jpg) vom Client aus dem Server senden und unter anderem Namen abspeichern.
Ich speichere das Bild erfolgreich in einen Buffer ab und beim übertragen habe ich schwierigkeiten. Ich benutze fread und fwrite dazu.. wie auch immer..
Um mich kurz zu fassen.. kann ich einen Integer-Wert vom Client aus zum Server versenden?
Freundliche Grüsse
Plop123
-
Hi
int versenden: Natürlich, geht schon.
Aber warum das Bild nicht Byteweise behandeln?
Zeig mal die Codeteile von send/recv.
Ist dir bewusst, dass die zwei Funktionen eventuell nur Teile des Buffers übertragen und nocheinmal aufgerufen werden müssen?Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
(alles clientseitig)Code cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#define LEN 1000 void sendjpg (int socket_nummer) { char photobuffer[LEN]; int ret_value; FILE *photo = fopen("photo/photo.jpg","rb"); FILE *new_photo = fopen("photo/new_photo.jpg","wb"); while (!feof(photo)){ ret_value = fread(photobuffer,1,LEN,photo); printf("\nBytes: %i\n",ret_value); fwrite(photobuffer,1,ret_value,new_photo); // ergebnis = send(socket_nummer,photobuffer, ret_value,0); } fclose(photo); }
mit diesem Codestück lädt man das Bild in den Buffer und gibt es anschliessend wieder aus..
ret_value sagt aus wie gross der Bufferinhalt ist welcher zum foto gehört.. da das neue bild ansonsten grösser wird als das original..Geändert von sheel (04.11.11 um 14:35 Uhr) Grund: Codetags
-
Aaalso...
zuerst mal: Bitte in Zukunft die Codetags verwenden.
Hat es einen Sinn, dass der Client das Bild neu abspeichert?
Soll das nicht beim Server passieren?
Für new_photo fehlt das fclose.
Das (auskommentierte) send hat den schon erwähnten Fehler (Erklärung kommt gleich).
edit:
send und recv haben die Eigenart, dass sie sich nicht
unbedingt an die übergebene Bytelänge halten.
Min. 1 Byte, max. die übergebenen Byte, aber auf mehr kann man sich nicht verlassen.
Code unten.
Und noch was: Irgendwie sollte man auch wieder merken, wenn das Bild fertiggesendet hat.
Wenn man die Dateilänge am Anfang noch nicht abgefragt hat und Endian-Probleme umgehen will:
Sende max. 255 Byte mit einem send, und vor jedem "Block" ein unsigned char, wieviel Byte jetzt kommen.
Wenn das char 0 ist, bedeutet das "Ende der Datei".
Ist etwas Overhead, aber verkraftbar.
Ich würde den Client also so machen:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
int sendjpg (SOCKET s, char *filename) { char buf[257]; int i, j, k; FILE *dat; dat = fopen(filename, "rb"); if(!dat) return 1; while(!feof(dat)) { i = fread(&buf[1], 1, 255, dat); buf[0] = (unsigned char)i; if(i != 255) buf[++i] = 0; i++; j = 0; while(j < i) { k = send(s, &buf[j], i - j, 0); if(k < 1) { fclose(dat); return 2; } j += k; } } fclose(dat); return 0; }
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
Ähnliche Themen
-
VPN client(vl auch server-Client) programmieren[C#/Java]
Von Doomt im Forum Coders TalkAntworten: 5Letzter Beitrag: 18.02.10, 08:41 -
Datei von Client zum Server übertragen --> Weiterleitung an Clients
Von Prengepower im Forum JavaAntworten: 0Letzter Beitrag: 02.12.09, 11:19 -
VPN Server - Netzwerk-Client kann nicht mit VPN-Client komunizieren
Von Redskin im Forum NetzwerkeAntworten: 4Letzter Beitrag: 08.11.09, 10:55 -
Client Server verbindung.: Nachricht an einzelnen Client?
Von lukelukeluke im Forum JavaAntworten: 2Letzter Beitrag: 23.05.05, 22:30 -
Datei vor dem Abmelden der Terminalservices vom Client an Server übertragen.
Von preko im Forum Visual Basic 6.0Antworten: 0Letzter Beitrag: 18.04.05, 10:30





Zitieren

Login






