Dateiübertragung XP/Vista c++

Crash Kid

Erfahrenes Mitglied
Hallo,

ich habe ein Programm geschrieben, dass eine Datei (*.exe, *.mp3, *.bmp usw.) binär einliest, es über das Netzwerk an den Client schickt und der Client diese Datei wieder abspeichert.
Hat auch wunderbar funktioniert, wenn beide Programme auf z.B. Windows Vista gelaufen sind.
Jetzt läuft ein Programm auf Windows XP und das andere auf Windows Vista, und plötzlich kann ich keine Datei mehr kopieren. Alle Dateien sind dann irgendwie beschädigt oder ähnliches.
Läuft beides auf XP gibt es auch keine Probleme.

Jetzt meine Frage: Kann es sein, dass XP die Dateien anders ausliest wie Vista oder so. Heißt, wenn ich Dateien auf XP auslese und auf Vista abspeicher, dass das nicht geht?
Oder verwende ich die falsche Funkion. Ich verwende
Code:
#include <fstream>

using namespace std;

int main()
{
    fstream fDatei;
    
    ...
    fDatei.open("C:\\test.exe", ios::in | ios::binary)
    fDatei.read(...)
    fDatei.close(...)

    ....//dann halt die datein im char-Arra an den Client schicken
    ....//und im Client mit fDatei.write() abspeichern

Sind diese Funktionen vllt Betriebssystem spezifisch? Also dass eben XP diese anders verwendet als Vista?
Hat schon mal jemand ähnliche Probleme gehabt?

Ich wäre für jede Antwort sehr dankbar....

grüße
 
Du hast vergessen zu erwähnen _wie_ Du denn die Daten überträgst. Es mag überraschend klingen, aber die Daten können nicht nur beim lesen/schreiben beschädigt werden sondern auch bei der Übertragung.
 
Ich übertrage die Daten über das Netzwerk, mittels TCP/IP.
Verwende dazu Sockets.

Damit sende ich die Daten:
Code:
iErgebnis_SendenEmpfangen = send(Socket_1, cDatei_Daten, iDatei_Dateigroesse, 0);  //Datei-Daten werden gesendet


Damit empfange ich die Daten (ermittle zuvor die Dateigröße und schick sie auch):
Code:
iDatei_Dateigroesse = atoi(cDatei_Dateigroesse);
char *cDatei_Daten = new char[iDatei_Dateigroesse];  //Char-Array in der Empfangenen Größe erstellen

iErgebnis_SendenEmpfangen = recv(Socket_1, cDatei_Daten, iDatei_Dateigroesse, 0);  //Dateidaten empfangen


grüße
 
Hallo,

überprüfst du auch den Rückgabewert von send und recv? Es kann ja vorkommen, dass die geforderte Datenmenge nicht komplett gesendet/empfangen werden konnte.

Grüße,
Matthias
 
Ja klar, ich überprüfe ich sie.

Code:
if(iErgebnis_SendenEmpfangen == -1)
{
    MessageBox(hWnd, "Die Datei-Daten konnte nicht empfangen werden.\n"
                     "Vermutlich wird die Datei nicht mehr richtig kopiert.", "Datei kopieren (T->C)", MB_ICONERROR | MB_OK | MB_DEFBUTTON1);
}
else
{
    fstream fDatei_kopieren;
    fDatei_kopieren.open(cDatei_Speicherpfad, ios_base::out | ios_base::binary | ios_base::trunc);  //Datei öffnen
    if(!fDatei_kopieren.good())
    {
        MessageBox(hWnd, "Die Datei konnte nicht gespeichert werden.", "Datei kopieren (T->C)", MB_ICONERROR | MB_OK | MB_DEFBUTTON1);
    }
    else
    {
        fDatei_kopieren.write(cDatei_Daten, iDatei_Dateigroesse);  //Dateidaten schreiben
        
        MessageBox(NULL, "Die Datei wurde erfolgreich kopiert.", "Datei kopieren (T->C)", MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
    }
                                            
    fDatei_kopieren.close();
}

delete[]cDatei_Daten;
 
Ich schätze Matthias meint ob der Wert den dir recv bzw send zurückgibt der Grösse der Datei entspricht, die du senden willst.
 
Achso, das weiß ich nicht.
Stimmt sollte das mal überprüfen. Danke für den Tipp, melde mich dann morgen ob es passt oder nicht.

grüße
 
Beim TCP kann es auch vorkommen das Packete zusammengefasst werden (siehe Nagle). Also auch wenn Du zwei oder mehr Packete einzeln absendest kommt am anderen Ende ein Packet an in dem dann die einzelnen gesendeten Packete zusammengefasst wurden.

Und nein, Nagle abschalten ist _nicht_ die Lösung davon, denn dieses Verhalten ist generell erwünscht ;)
 
Aha,

ich habe Nagle noch nie im zusammenhang damit gehört. Überhaupt habe ich das noch nie gehört.
Was ist Nagle?

Ich sende ja eigentlich nur ein Paket ab. Und zwar in der Größe der zu versendenden Datei. Was die Funktion send() dann noch damit macht weiß ich nicht.
Oder wie hast du deine Antwort genau gemeint mit mehreren Paketen?


grüße
 
Empfangen in etwa so - senden geht vom Prinzip her genauso

C++:
int pos = 0;
int size = ...;

while( pos != size ) {
    int rc = recv( socket, daten + pos, size - pos, 0 );
    if( rc < 0 ) {
        std::cout << "Ooops, Fehler..." << std::endl;
        return false;
    }
    
    pos += rc;
    std::cout << (pos / 1024) << "kB von " << (size / 1024) << "kB empfangen..." << std::endl;
}

return true;
 
Zurück