TCP - Datei Laden

  • Hi,
    wie lädt man per TCP eine Datei runter. Als Beispiel will ich einfach mal das AutoIt.de Banner laden, also http://www.autoit.de/wcf/images/autoit_logo.gif


    Mein Versuch:


    Das Problem ist, dass man damit nicht die Bilddaten empfängt. Hat jemand ne Idee?


    Thx!
    anno2008

  • Ich glaube das problem liegt daran, das man für TCP erst einmal einen "TCP-server" auf der internetseite braucht, der auch auf dem gleichen port läuft.
    Wenn du eine datei aus dem internet downloaden möchtest dann benutze doch einfach: "InetGet()"

    Mfg. PCKing



  • damit "TCPConnect" funktioniert muss aber auf der gegenstelle(in diesem fall die internetseit "www.autoit.de") ein anderes autoit script ausgeführt werden, mit dem kommando "TCPAccept()"!
    ansonsten greift dein "TCPConnect" ins leere, das kannst du nämlich feststellen, indem du einfach in den code in der zeile 17 in den if satzt einfach ein "msgbox(0,"error",@error)" einfügst.

    Mfg. PCKing



  • funktioniert einwandfrei, allerdings muss der Rückgabestring gesplittet werden weil er einen header hat.

  • $oFile = FileOpen(@scriptdir&"\AutoItlogo.gif", 18)


    $srecv=stringreplace($srecv,"0x","") ;alle 1024 langen strings wieder aufdröseln
    $srecv=stringtrimleft($srecv,stringinstr($srecv,_stringtohex("GIF"))-1)
    $srecv=stringleft($srecv,12718*2) ;die zahl hab ich aus dem header =länge des gif
    $sRecv= binarytostring("0x"&$srecv)


    FileWrite($oFile, $sRecv)


    FileClose($oFile)
    so gehts einwandfrei...musst nur noch die Länge der übertragenen Daten (hier das GIF) aus dem Header fischen....ich bastel mal was^^

  • sodele, liest die Dateilänge aus dem Header und schreibt das File.
    $oFile = FileOpen(@scriptdir&"\AutoItlogo.gif", 18)
    $srecv=stringreplace($srecv,"0x","") ;alle 1024 langen strings wieder aufdröseln


    $header=binarytostring("0x"&stringleft($srecv,stringinstr($srecv,"0D0A",0,11)+3)) ;das 11. crlf finden
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$header' & @lf & @lf & 'Return:' & @lf & $header) ;### Debug MSGBOX
    $headerarray=stringsplit($header,@crlf,3) ;zeilen splitten
    _arraydisplay($headerarray)
    $laenge=number(stringright($headerarray[6],stringlen($headerarray[6])-stringinstr($headerarray[6]," ",0,-1))) ;zahl aus dem 6. arrayfeld auslesen
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$laenge' & @lf & @lf & 'Return:' & @lf & $laenge) ;### Debug MSGBOX


    $srecv=stringtrimleft($srecv,stringlen($header)*2) ;header abschneiden
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $srecv = ' & $srecv & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console


    $srecv=stringleft($srecv,$laenge*2) ;die zahl hab ich aus dem header =länge des gif (hoffentlich^^)
    $sRecv= binarytostring("0x"&$srecv)


    FileWrite($oFile, $sRecv)


    FileClose($oFile)
    /*EDIT*/ kl. Fehler beseitigt, du machst das wie ich dich kenne mit einer Zeile regex^^
    Super Script übrigens! :thumbsup:

  • Hey,
    Dankeschön für die Mühe, ich werde es mir morgen genauer unter die Lupe nehmen, ich habs jetzt versucht, aber es will nicht mehr so wie ich das will ^^.
    Das Problem, was ich habe ist halt, dass das ja nicht nur auf GIF-Dateien und vor alem nicht nur für den Header von AutoIt passen muss. Aber ich muss mal schauen, da wird sich ne Lösung finden.
    Wenn ich dein Script kapiert habe werde ich es ein bisschen ändern bis es passt.
    Diese ganze Umwandlerei war noch nie so mein Ding :P.


    Danke für die Ideen, jetzt hab ich einen Punkt an dem ich auf jeden Fall anknüpfen kann!
    anno2008

  • Hallo,
    sicherlich wird es irgendwo eine Definition des Headers geben, der Rest ist wie schon gezeigt pillepalle.
    Ich hab den Header in meinem Beispiel beim 11. CRLF per definitionem "beendet" :D , hat so schön gepasst.
    Beim Test mit der uhr.png oben rechts hier auf der site ist es der 10. CRLF bei dem man trennen muss....


    Wenn man ein Protokoll/Format nicht kennt, dann muss man eben solange dran rumstricken, bis es passt, oder bis man jemanden trifft der weiß wie es geht^^


    /*edit*/ Übertragene Dateilänge (incl. Header) minus ausgelesene "Rohdatenlänge" ist gleich Länge des Headers;http://www.autoit.de/wcf/icon/dateS.png
    $oFile = FileOpen(@scriptdir&"\uhr.png", 18)
    $srecv=stringreplace($srecv,"0x","") ;alle 1024 langen strings wieder aufdröseln
    $header=binarytostring("0x"&stringleft($srecv,stringinstr($srecv,"0D0A",0,10)+3)) ;das 10. crlf finden
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$header' & @lf & @lf & 'Return:' & @lf & $header & @CRLF &stringlen($header) ) ;### Debug MSGBOX
    $headerarray=stringsplit($header,@crlf,3) ;zeilen splitten
    _arraydisplay($headerarray)
    $laenge=number(stringright($headerarray[6],stringlen($headerarray[6])-stringinstr($headerarray[6]," ",0,-1))) ;zahl aus dem 6. arrayfeld auslesen
    $srecv=stringtrimleft($srecv,stringlen($srecv)-$laenge*2) ;header abschneiden
    $sRecv= binarytostring("0x"&$srecv) ;fileformat
    FileWrite($oFile, $sRecv)
    FileClose($oFile)noch beliebig kürzbar, aber so wird der Weg zu den Rohdaten relativ klar

  • Vielen Dank Andy, jetzt hats auch bei anderen Dateien geklappt :)
    Solche Umwandlungen machen mich echt noch verrückt 8) .


    Also ganz herzlichen Dank für die Mühe, ich werds auf jeden Fall gebrauchen.

  • Kein Ding...immer wieder gerne.
    Aber eins noch, du musst abfangen, ob du eine "normalen" HTTP-Rückgabe erhälst (als Ascii-Text) oder eine mit der HEX-Kennung '0x' an den ersten beiden Stellen als Binärübertragung!
    Wenn bei einem Download die Datei nicht vorhanden oder falsch geschrieben wurde, dann bekommst du ja die Fehlermeldung in Klarschrift....


    btw. der Header trennt sich von der Nachricht durch eine "blank line", das sollten also 2 CRLF direkt hintereinander sein, die Header sind nicht "genormt"
    weiterhin wäre zu überlegen, die Daten direkt in eine Datei zu schreiben statt sie erst komplett in den Speicher zu lesen.