Datei mit Winsock versenden -Methoden

  • VB6

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von nicok.

    Datei mit Winsock versenden -Methoden

    Hallo,

    ich möchte eine eigene Funktion zu Sachen "Dateien über Winsock versenden" schreiben.

    Ich habe bis jetzt 2 Ideen:

    1) die gesammte Datei wird in eine Variable gespeichert. Dann wird die Datei 'zerstückelt' und versendet.
    Nachteil: großer RAM verbrauch da die gesammte Datei in einer Variable gespeichert wird.

    2) die Datei jeweils nur Stückchen weise einlesen und danach versenden. Also Part1 einlesen und verschicken, danach Part2 einlesen und verschicken etc.

    Ich denke 2) ist die bessere Lösung (wegen RAM).
    Nur auf welche Arten kann ich eine Datei einlesen? Das geht doch auch iwie binär (ist das schneller?!) oder ganz einfach wie eine Textdatei.

    Wer alles Ideen hat bitte posten =)
    (1) Zuallererst ist zu klären, an wen die Datei gesendet werden soll.
    • An ein Programm auf dem gleichen Rechner
    • An ein Programm im gleichen LAN
    • woanders hin


    (2) Dann stellt sich die Frage nach dem Format der Datei
    • Textdatei
    • irgend was anderes


    (3) Auch die erwartete Größe der Datei spielt eine Rolle
    • größer wie ca 10 MB
    • kleiner wie ca 10 MB


    (1) Wenn die Datei nur auf dem gleichen Rechner oder im LAN verschickt werden soll reicht es normalerweise aus, nur den Pfad zur Datei zu schicken. Beim LAN muß natürlich noch dafür gesorgt werden dass auch auf die Datei zugegriffen werden kann, evtl die vorher in ein freigegebenes Verzeichnis kopieren.

    (2) Formatmäßig gibt es bei VB6 nur zwei Möglichkeiten: Entweder es ist eine Ansi-Textdatei oder irgendwas anderes. Dem Winsock ist das aber egal, das kann nur Strings versenden also muß man nicht-Textdateien in einen Byte-Array einlesen und den dann in einen String konvertieren.

    (3) Dateien bis ca 10 MB kann man problemlos in einem Stück mit der Input-Funktion in eine Variable einlesen. Bei größeren Dateien ist dann eine andere, erheblich aufwändigere Vorgehensweise (FileMapping) besser geeignet.

    Um die Paketgröße beim Versenden, also um das Zerstückeln braucht man sich normalerweise nicht zu kümmern, das macht Winsock von sich aus. Hier muß man eigentlich eher dafür sorgen, dass das Ziel weiß wann Schluß ist, also nach der Datei noch einen "Ende"-Befehl schicken.
    Vielen Dank für deine Antwort.
    Der Versand geschieht über das Internet, die Dateigröße kann sowohl unter als auch über 10mb liegen.
    Ich habe mir mal diese Art angesehen:

    Open Path for Binäri as #1
    Get #1, , Speicher
    Close #1

    Das war jetzt nur kurz aus dem Gedächtnis gegriffen.
    Aber so kann ich die Datei doch stückchenweise auslesen, in eine Variable (string) speichern und dann ganz normal per ws.senddata Speicher verschicken, oder?
    *nach Netzwerkprogrammierung verschoben*

    Besser als so ein ENDE-Befehl (oder Zusätzlich zu) ist es vorher die Dateigröße zu verschicken - der ENDE-Befehl kann nämlich zufällig auch in der Datei stehen, dann lässt sich diese nicht übertragen :(

    Gaga schrieb:

    (2) Dem Winsock ist das aber egal, das kann nur Strings versenden also muß man nicht-Textdateien in einen Byte-Array einlesen und den dann in einen String konvertieren.
    Wie genau geht das? Und muss ich das unbedingt?
    Ich hab bis jetzt versucht alle Dateien einzulesen wie als wäre es eine Textdatei:
    Open File(0) For Binary As #1
    etc..