[WinSock] Dateien versenden



  • Jaja ich weiß. 😃 😃 🙄
    Mein Problem ist nur, dass egal mit welcher Variante immer ein Problem besteht...
    Wenn ich zum Beispiel via fopen () eine .exe-Datei öffne und segmentweise verschicke, kommt sie zwar an, allerdings fehlt schon das Icon der .exe und wenn ich sie starte, sagt er, dass er ein Problem festgestellt hat und das Programm beendet werden musste. Das geht auch mit anderen Dateitypen so, die kommen eben manchmal (ja, manchmal klappts auch) nur stückweise an und ich habe keine Ahnung woran das liegt...

    so empfange ich die Dateien:

    ...
    
    pFile = fopen (buffer, "wb");
    if (pFile == 0)
    {
        fclose (pFile);
        OutputDebugString ("(ERROR) WAXSOCKET::RecvData () -> fopen () fehlgeschlagen!\n");
        return WSERROR_FILE;
    }
    
    iData = wsh.iFileSize;
    
    char file[4096];
    
    while (iData > 0)
    {
        dwData = recv (sSocket, file, 4096, 0);
        fwrite (file, dwData, 1, pFile);
    
        iData -= dwData;
    }
    
    fclose (pFile);
    
    ...
    

    und so sende ich sie:

    ...
    
    //TEIL 1: öffnen und analysieren der Datei
    pFile = fopen (tyData, "rb");
    if (pFile == 0)
    {
        fclose (pFile);
        OutputDebugString ("(ERROR) WAXSOCKET::RecvData () -> fopen () fehlgeschlagen!\n");
        return WSERROR_FILE;
    }
    
    fseek (pFile, 0, SEEK_END);
    iData = ftell (pFile);
    fseek (pFile, 0, SEEK_SET);
    
    wsh.iFileSize = iData;
    
    lstrcpy (wsh.lpFile, ::FormatFileString ((char*) tyData));
    wsh.iSendMode = SEND_FILE;
    wsh.iBlockSize = SEND_BLOCKSIZE;
    
    ...
    
    //TEIL 2: senden der Datei
    char file[4096];
    
    while (iData >= 4096)
    {
        fread (file, 4096, 1, pFile);
        send (sSocket, file, 4096, 0);
    
        iData -= 4096;
    }
    
    if (iData != 0)
    {
        fread (file, iData, 0, pFile);
        send (sSocket, file, iData, 0);
    }
    
    fclose (pFile);
    
    ...
    

    Das ganze ist Teil einer Klasse, die aber eigentlich keine weitere große Bedeutung hat. Falls doch noch Unklarheiten bestehen, einfach fragen 😉
    Danke schonmal im voraus!



  • Für was benötigst Du lstrcpy?
    Die Funktion arbeitet mit NULL- terminierten Strings, Du aber mit binary Daten...

    Simon



  • lstrcpy benötige ich, um wsh.lpFile mit dem Dateinamen zu füllen. FormatFilString () macht nichts anderes, als den Dateinamen aus einer Pfadangabe zu extrahieren...
    Ich habe nur eine Sende-Funktion, die je nach Angabe entweder einen einfachen String, eine Struktur oder eben eine Datei versendet. Damit der Empfänger aber weiß, was gemacht wird, schicke ich vorher einen Header los der alle nötigen Informationen enthält...

    Meinst du, dass send () mit NULL terminierten Strings arbeitet, oder lstrcpy () ??



  • also erstmal: *push* 😃
    und dann: hat vllt. jmd noche in andere lösung die aber auch komplett funktioniert?? weil diese klasse ist verdammt wichtig für mich 🙄


Anmelden zum Antworten