Bild in Bytestrom umwandeln und über Sockets verschicken



  • FILE* bild=fopen("...","wb");
    empfangen=1;
    while (empfangen>0)
    {
      recv(list,empfangen);//hier wieder die Socket-Funktion zum empfangen eintragen
      fwrite(list,empfangen,1,bild);
    
      //Debug-Ausgaben:
      cout<<"gelesen:"<<empfangen<<endl;
      cout<<"Daten  :"<<list<<endl;
    }
    fclose(bild);
    

    (Die Debug-Ausgaben sollten das selbe anzeigen wie auf der Senderseite - außerdem kannst du dir hinterher das empfangene und gespeicherte Bild im Explorer aufrufen)



  • Das verstehe ich nicht...

    wie komme ich denn aus der while schleife wieder raus?
    Bzw wo wird das "empfangen" geändert?



  • Sorry, ich bin jetzt davon ausgegangen, daß recv() den zweiten Parameter als Referenz bekommt und dort die Anzahl der empfangenen Bytes einträgt.



  • Hallo zusammen.

    Und wieder gibt es ein Problem:
    gestern hat alles soweit funktioniert. Auf jeden Fall hat der Client das Bild in Blöcken versendet.
    Jetzt habe ich ein bißchen im Server rumgespielt und der Client macht mir jetzt eine recht komische Ausgabe: Nämlich garnichts.
    Wieso?

    Client:

    char list[255];
          int gelesen, lenout;
          FILE* bild;
    
          if (m_Socket->isWriteable()){
              if( (bild = fopen( "C:\\blue_horse_col.bmp","rb" )) != NULL ){
                  while(!feof(bild))
                      {
                        gelesen = fread(list,sizeof(list),1,bild);
                        lenout = m_Socket->write((const unsigned char *)gelesen, (int) list);
    
                      //Debug-Ausgaben:
                      cout<<"gelesen:"<<gelesen<<endl;
                      cout<<"Daten  :"<<list<<endl;
                      }
            fclose(bild);
              }
       else
          cout << "File kann nicht geöffnet werden" << endl;
          }
    

    Server:

    char list[255];
          int empfangen, lenin;
          FILE* bild;
    
          //FILE* bild=fopen("C:\\blue_horse_col.bmp","wb");
          empfangen=1;
    
          if (acceptedSocket->isReadable())
    		{
          while (empfangen>0)
           {
             empfangen=fwrite(list,sizeof(list),1,bild);
             lenin	= acceptedSocket->read((unsigned char	*)empfangen, 255, false);
    
               cout<<"Empfangen:"<<empfangen<<endl;
               cout<<"Daten  :"<<list<<endl;
           }
        fclose(bild);
        }
    

    Danke danke.... 💡



  • erstens: Du hast beim Server die Reihenfolge vertauscht:

    empfangen=acceptedSocket->read((unsigned char*)list, sizeof(list), false);
    fwrite(list,empfangen,1,bild);
    

    zweitens: Die Sende-Funktion beim Client sieht merkwürdig aus:

    m_Socket->write(list,gelesen);
    

    Drittens: Nimm mal verschiedene Dateinamen für Server und Client - dort gibt es Probleme, wenn beide Programme gleichzeitig die selbe Datei öffnen wollen (Server bekommt Exklusivrecht und Client verabschiedet sich mit einem "Datei nicht verwendbar").



  • CStoll (off) schrieb:

    Drittens: Nimm mal verschiedene Dateinamen für Server und Client - dort gibt es Probleme, wenn beide Programme gleichzeitig die selbe Datei öffnen wollen (Server bekommt Exklusivrecht und Client verabschiedet sich mit einem "Datei nicht verwendbar").

    verstehe ich nicht. Meinst du das hier:

    FILE* bild=fopen("C:\\blue_horse_col.bmp","wb");

    Ich habe die Sachen geändert, aber die Ausgabe ist immernoch ganz komisch.

    Gelesen: 0
    Daten : ganz komisch (nicht wie sonst....)

    Thanx



  • Nochmal: Bilddateien sind BINÄR, die SEHEN komisch aus wenn man sie als Text darstellt!

    Öffne das Bild mal mit nem Editor!



  • nein, ich glaube nicht,dass es daran liegt. Gestern hatte ich eine ganz andere Ausgabe, die mehr Sinn gemacht hat.

    Wie schua ich mir denn das Ergenis im Editor an???



  • Guck doch mal im Explorer nach, wie groß das Bild eigentlich ist (ich vermute stark, du hast dir bei den Versuchen, den Server in Gang zu bringen, dein Bild zerschossen - und hast nur noch eine 0 Byte BMP-Datei rumliegen).



  • Perfekt. Danke. Es läuft!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Es lag tatsächlich daran, dass ich mein Bild mit 0 überschrieben hab.

    Vielen Dank an alle, die mir geholfen haben 🙂


Anmelden zum Antworten