Bild vom Client zum Server übertragen

plop123

Grünschnabel
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?
 
C++:
#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);
}
(alles clientseitig)
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..
 
Zuletzt bearbeitet von einem Moderator:
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:
C++:
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ß
 
Zurück