tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
192
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    plop123 plop123 ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    7
    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
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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, ...?

  3. #3
    plop123 plop123 ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    7
    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);
    }
    (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..
    Geändert von sheel (04.11.11 um 14:35 Uhr) Grund: Codetags
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    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

  1. Antworten: 5
    Letzter Beitrag: 18.02.10, 08:41
  2. Antworten: 0
    Letzter Beitrag: 02.12.09, 11:19
  3. Antworten: 4
    Letzter Beitrag: 08.11.09, 10:55
  4. Antworten: 2
    Letzter Beitrag: 23.05.05, 22:30
  5. Antworten: 0
    Letzter Beitrag: 18.04.05, 10:30

Stichworte