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:

    Spoiler anzeigen
    [autoit]

    TCPStartup()
    $iSocket = TCPConnect(TCPNameToIP("www.autoit.de"), 80)

    [/autoit] [autoit][/autoit] [autoit]

    $header = "GET /wcf/images/autoit_logo.gif HTTP/1.1" & @CRLF & _
    "Host: autoit.de" & @CRLF & _
    "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 GTB6" & @CRLF & _
    "Keep-Alive: 300" & @CRLF & _
    "Connection: keep-alive" & @CRLF & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    TCPSend($iSocket, $header)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $sRecv = TCPRecv($iSocket, 1024)
    If $sRecv <> '' Then
    While 1
    $sRecv &= TCPRecv($iSocket, 1024)
    If @error Then ExitLoop 2
    WEnd
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    $oFile = FileOpen("AutoItlogo.gif", 2)
    FileWrite($oFile, $sRecv)
    FileClose($oFile)

    [/autoit]

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

    Thx!
    anno2008

    Einmal editiert, zuletzt von anno2008 (27. November 2009 um 16:17)

  • 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


    Mein PC

    CPU: AMD FX 8350 8x4.00GHz
    Ram: 8GB DDR3
    Grafikkarte: Nvidia Geforce GTX 960 (4GB)
    Festplatten: 500GB SSD 1TB HDD
    Laufwerk: Blueray RW+ Brenner

  • 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


    Mein PC

    CPU: AMD FX 8350 8x4.00GHz
    Ram: 8GB DDR3
    Grafikkarte: Nvidia Geforce GTX 960 (4GB)
    Festplatten: 500GB SSD 1TB HDD
    Laufwerk: Blueray RW+ Brenner

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

  • [autoit]

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

    [/autoit][autoit][/autoit][autoit]

    $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)

    [/autoit][autoit][/autoit][autoit]

    FileWrite($oFile, $sRecv)

    [/autoit][autoit][/autoit][autoit]

    FileClose($oFile)

    [/autoit]

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

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (27. November 2009 um 00:25)

  • sodele, liest die Dateilänge aus dem Header und schreibt das File.

    [autoit]

    $oFile = FileOpen(@scriptdir&"\AutoItlogo.gif", 18)
    $srecv=stringreplace($srecv,"0x","") ;alle 1024 langen strings wieder aufdröseln

    [/autoit][autoit][/autoit][autoit]

    $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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

    FileWrite($oFile, $sRecv)

    [/autoit][autoit][/autoit][autoit]

    FileClose($oFile)

    [/autoit]


    /*EDIT*/ kl. Fehler beseitigt, du machst das wie ich dich kenne mit einer Zeile regex^^
    Super Script übrigens! :thumbup:

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (27. November 2009 um 00:26)

  • 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

    [autoit]

    ;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)

    [/autoit]

    noch beliebig kürzbar, aber so wird der Weg zu den Rohdaten relativ klar

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (27. November 2009 um 15:03)

  • 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.

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (27. November 2009 um 18:15)