TCP: Alles angekommen?

  • Hallo,

    Da ich nicht weiß, wie es bei Langsameren Verbindungen ist, ob da zwischendrin ein TCPRecv einfach mal leer sein kann und erst das nächste wieder daten enthällt, und ich natürlich ALLE daten haben möchte habe ich mir eine schleife Geschrieben, die ERST DANN abbricht, wenn eine Sekunde nichts mehr gekommen ist:

    [autoit]

    ;Verbindung hergestellt, rufe Request ab
    $TimerDiff = 0
    $TCPRecv = ""
    $StartTime = -1
    Do
    $LastRecv = TCPRecv($TCPCon, 512)
    $TCPRecv &= $LastRecv
    if($LastRecv = "" AND $StartTime = -1) Then
    $StartTime = TimerInit()
    $TimerDiff = 0
    Elseif($LastRecv = "" AND $StartTime <> -1) Then
    $TimerDiff = TimerDiff($StartTime)
    Else
    $StartTime = -1
    $TimerDiff = 0
    endif
    until StringInStr($TCPRecv, "$ENDREQUEST$") OR $TimerDiff > 1000

    [/autoit]


    Allerdings finde ich diese Methode nicht grade der bringer... Gibt es vll. noch bessere methoden?
    Habe jetzt 1. den string $ENDREQUEST$ drin, der am ende steht, oder als absolute sicherheit nochmal die 1 sekunde... Aber da gibt es bestimmt noch bessere möglichkeiten.
    PS: @ERROR ist KEINE dieser möglichkeiten, da evtl. noch daten zurückgeschickt werden müssen.

  • Du könntest die Nachricht/Daten erstmal hashen und dann nach dem hoffentlich
    vollständigen Übertragen den gesendeten Hash mit einem vom Server erstellten Hash
    vergleichen. Vielleicht gibt es speziell zum versenden noch (mir unbekannte) Methoden.
    Mit dem Hash sollte es jedenfalls klappen (sofern der richtig übermittelt wird :D )!

    EDIT: Du kannst auch eine eigene Syntax erstellen die den Anfang des Sendens und das
    Ende beschreibt z.B.: <Datei> | Absenden | dann den Dateiinhalt | Absenden | dann </Datei> | Absenden
    d.h. wenn der Server <Datei> empfängt und nach einiger weile </Datei> gesendet bekommt, dann "weiss" er,
    dass die Datei übermittelt wurde. Anschließend kannst du den Hash machen.

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Da müsste ich wieder warten bis der hach angekommen ist, dann am trenner trennen, dann jedesmal wenn was gekommen ist (bzw. wenn grade nichts kommt) prüfen... Aber mir ist grad eingefallen einfach am anfang den StringLen zu übermitteln von nachfolgenden Request