Bild in Bytestrom umwandeln und über Sockets verschicken



  • Erstens: Wenn du lesen willst, öffne die Datei doch als "rb" (read, binär).
    Zweitens: Daß die Ausgabe etwas kryptisch aussieht, braucht dich nicht zu stören - BMP-Dateien sind in einem Format, daß nicht unbedingt leserlich aussieht 😉
    Drittens: Du mußt den Inhalt von list über das Netzwerk schicken (jeweils in der Schleife).



  • ich habe da a+ durch rb ersetzt und jetzt habe ich :
    Number of read Items: 0
    Content of Buffer:

    Da steht jetzt nichts..............



  • Ja, du gibst ja auch den letzten Block aus, den du lesen wolltest - da feof() erst anschlägt, nachdem das LEsen fehlgeschlagen ist, ist das ein leerer Block.

    while(!feof(bild))
    {
      gelesen=fread(list,sizeof(list),1,bild);
      send(list,gelesen);//hier kommt die Socket-Funktion zum senden rein
    
      //Debug-Ausgaben:
      cout<<"gelesen:"<<gelesen<<endl;
      cout<<"Daten  :"<<list<<endl;
    }
    fclose(bild);
    


  • Headhunter schrieb:

    Deshalb musst du dir noch Gedanken über ein eigenes Übertragungsprotokoll machen und die Daten selber wieder zusammenflicken.

    quatsch, das macht tcp/ip alles schon selber.



  • Headhunter meinte wohl sowas wie HTTP, FTP oder IRC.



  • super super....
    Vielen vielen Dank....
    Es tut soweit.

    Wie kann ich mir jetzt aber auf Serverseite das Bild darstellen lassen um zu testen, ob es auch wirklich da ist?



  • 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