Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Datei lesen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
28.01.2009, 06:02 Uhr
0xdeadbeef
Gott
(Operator)


Binärdateien wie jpegs können durchaus mal ein Null-Zeichen enthalten. (Zum Beispiel, um das Ende von irgendetwas zu bezeichnen...)

Die restlichen Daten im Block werden sich wohl dahinter befinden. Aber: Es ist keine besonders gute Idee, eine Binärdatei auf die Konsole zu schmeißen; da können locker auch mal ein paar Steuerzeichen drin sein, die dir die tty versauen. Wenn du auf der Konsole ansehen willst, was gesendet wird, geh zeichenweise da durch und lass dir die Hex-Werte ausgeben oder so.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
28.01.2009, 08:10 Uhr
filth



Das habe ich mir auch gedacht - wäre auch nicht das Problem, dass es nicht in die Konsole ausgegeben werden kann.

Allerdings wird dieser Buffer über ein Socket gesendet und auf der Empfängerseite in eine Datei geschrieben, dort kommen auch nur diese paar Zeichen an.

Das Schreiben mache ich so:


C++:
                        char *buffer = new char[dataSize];
            int nret = recv(theClient, buffer, dataSize, 0);

            if (nret == SOCKET_ERROR)
                cout << "ERROR" << endl;

            buffer[dataSize-1] = '\0';

            cout << "Received Buffer content: " << endl;
            //cout.write (buffer, dataSize);
            cout << buffer;
            cout << endl;
            cout << "--------------------------------" << endl;

            // write buffer into file
            fstream f;
            f.open(fileReceiveName.c_str(), ios::out|ios::binary);
            f << buffer;
            f.close();



Der Bufferinhalt müsste ja korrekt in der Datei stehen, Konsole lassen wir aussen vor

Edit: Ich habe gerade mir die .jpg nochmal in Notepad angeschaut - es wurden alle (4) Zeichen vor dem ersten Leerzeichen gesendet bzw empfangen

Dieser Post wurde am 28.01.2009 um 08:22 Uhr von filth editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
28.01.2009, 08:25 Uhr
0xdeadbeef
Gott
(Operator)


Nein, der Buffer wird auch beim Schreiben als null-terminierter String behandelt. Was du willst, ist etwa

C++:
f.write(buffer, nret);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
28.01.2009, 09:25 Uhr
filth



Hi,

das funktioniert. Danke zum 33ten

Nun gibt es aber ein anderes Problem - evtl sollte ich dafür einen neuen Thread aufmachen, ich versuche es aber erstmal hier, um nicht alles voll zu posten.

Das Versenden kleinerer Dateien funktioniert (160 byte).
Versuche ich eine größere (80 kByte) Datei zu versenden, beinhaltet die Empfangsseite ab einem bestimmten Punkt im Buffer nur noch Schrott.

Ich habe probehalber den Buffer vor dem Versenden in eine Datei geschrieben - da passt es noch. Ergo geht beim Senden was schief.

Hängt es mit meiner Vorgehensweise ab? Der Algorithmus ist im moment so:

1. Datei lesen und Größe feststellen
2. Sender versendet Header mit Dateinamen und Größe.
3. Empfänger richtet Buffer entsprechend der Dateigröße ein und sendet ein ACK
4. Sender empfängt ACK und sendet den gesamten Buffer auf einmal.

Jetzt kann man nicht beliebig große Datenpackete versenden, der Buffer wird von irgendeiner Schicht segmentiert und da vermute ich den Fehler. Sieht das jemand ähnlich?
In diesem Fall müsste ich den Buffer in N Pakete zerlegen und häppchenweise senden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
28.01.2009, 11:12 Uhr
filth



Edit sagt:

Es scheint nicht deterministisch fehlzuschlagen und zu funktionieren. Das macht die Fehlersuche nicht unbedingt einfacher.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
01.02.2009, 00:02 Uhr
0xdeadbeef
Gott
(Operator)


Ich weiß nicht, wie du deine Sockets öffnest und behandelst, deshalb kann ich nur raten, aber kann es sein, dass du in eine race condition läufst, also z.B. der Empfänger versucht, Daten zu lesen, bevor der Server sie geschickt hat? Bei non-blocking sockets kann sowas vorkommen, wenn man Fehlercodes ignoriert.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: