Daten via TCP versenden / empfangen

  • Hey Leute,
    Ich denk mal die Überschrift sagt alles,
    Ich will Daten via TCP versenden(nur im LocalNetwork), ein paar Foren hab ich mir jetzt schon durchgelesen und kam immer wieder auf den Vorschlag
    Daten/Dateien in Binär umzuwandeln, zu senden, und zurück zuwandeln.

    jetzt stell ich einfach mal meine Fragee an die Community:

    Wie wandle ich z.B. die gesamte Datei "Bild1.bmp" in Binär um?

    (Senden via TCP ist kein Problem)

    und: Wie wandle ich die Empfangene Datei nun wieder zurück?


    Ich würde gerne auf die von Bugfix geschriebene _sendFile und _reciveFile, komplett verzichten und mir alles lieber selbst erarbeiten(:

    mit freundlichen Grüßen
    TimoIt :)

  • Mit "Binary" wandelst die eingelesene Datei in Binär um und mit "BinaryToString" vor dem erstellen der Datei am Ziel wieder zurück.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Zitat

    ok, nächste frage: wie les ich die Datei dann ein, FileInstall?


    [Sarcasm]Höchstwahrscheinlich[/Sarcasm] gibt es eine Funktion die FileRead() heißt und
    Files lesen kann.

    Zitat

    und wie geb ich sie dann aus? also wie schreib ich die Datei dann zb in @ScriptDir?


    [Sarcasm]Äquivalent müssten sich die Entwickler doch auch eine Schreibfunktion überlegt haben[/Sarcasm]
    Wie wärs mit FileWrite() ? :rolleyes:

    Manchmal ist es hilfreich einen Blick in die Hilfedatei (kostenlos, und sogar auf Deutsch wenn man drauf besteht) und auch
    in vergangene Threads zu werfen! :whistling:
    PS: In der Hilfedatei sind zu den meisten Funktionen kurze Beispiele gegeben ;)

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

  • Ich hab jetzt mal paar Probe scripts geschrieben,
    naja funtzen tuts überhaupt nicht


    Sender!

    [autoit]

    TCPStartup()
    HotKeySet("{F4}","_Senden")

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

    while 1
    sleep(100)
    WEnd

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

    func _Senden ()
    $DateiSenden = InputBox("Datei?","Was Senden?")
    $Datei = @ScriptDir&"/"&$DateiSenden
    $ServerIP = "192.168.178.34"
    $ServerPort = 1000

    $ConnectedSocket = TCPConnect($ServerIP, $ServerPort)

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

    $file = FileOpen($Datei, 0)
    $Daten = FileRead($file)
    $Binary = Binary($Daten)

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

    TCPSend($ConnectedSocket,$Binary)
    TCPCloseSocket($ConnectedSocket)

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

    EndFunc

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


    Empfänger!

    [autoit]

    TCPStartup()
    $EigeneIP = @IPAddress1
    $EigenerPort = 1000

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

    $mySocket = TCPListen($EigeneIP,$EigenerPort)

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

    $Zieldatei = @ScriptDir

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

    while 1
    $con = TCPAccept($mySocket)

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

    If $con >=0 Then
    $rev = ""

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

    While True
    $rev &= TCPRecv($con,99999)
    If @error Then ExitLoop
    WEnd
    If $rev <> "" Then
    $BinareDaten = $rev
    $String = BinaryToString($BinareDaten)
    FileWrite($Zieldatei,$String)
    Exit
    EndIf

    EndIf


    WEnd

    [/autoit]

    woran könnte es liegen? ich hab die methode mit fileread, fileopen,etc verwendet wie von der Community gesagt.

  • Dann werte halt mal die @error aus dann siehst was das Problem ist.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Du musst die Datei im Binär Modus öffnen um den Binären inhalt herauszulesen dazu musst du zum flag einfach 16 addieren:
    Also musst beim Sender das stehen :

    [autoit]

    $file = FileOpen($Datei,16) ; 0 = Lesen + 16 Binäry modus = 16

    [/autoit]


    Das Binary() brauchst du nicht und du solltest nach dem lesen die Datei wieder schließen also:

    [autoit]

    FileClose($file)

    [/autoit]




    Und Beim Empfänger musst du die Datei ja Erstmal öffnen also wieder das :

    [autoit]

    $file = FileOpen($Datei,17) ; 1 = Schreiben + 16 Binäry modus = 17

    [/autoit]



    Und auch wieder schließen, Das BinaryToString brauchst du nicht


    MFG Everkosus


  • Da wären noch ein paar Sachen.

    [autoit]

    $Datei = @ScriptDir&"/"&$DateiSenden

    [/autoit]


    Das müsste ein Backslash sein.

    [autoit]

    $Datei = @ScriptDir & "\" & $DateiSenden

    [/autoit]

    Und das musst du wohl auch noch ändern:

    [autoit]

    FileWrite($Zieldatei,$String)

    [/autoit]


    $Zieldatei ist in dem Moment @ScriptDir. Das geht nicht, denn dann hast du keinen Dateinamen angegeben.
    Bei einer .exe müsste das dann so sein:

    [autoit]

    FileWrite($Zieldatei & "\Dateiname.exe", $String)

    [/autoit]

    Und es geht noch weiter.

    [autoit]

    If @error Then ExitLoop

    [/autoit]


    Das funktioniert auch nicht. TCPRecv wird dir keinen @error setzen wenn die Übertragung abgeschlossen ist.
    Stattdessen solltest du das verwenden.

    [autoit]

    If $rev = "" Then ExitLoop

    [/autoit]

    So, ich denke das wars. Ich hoffe ich konnte dir helfen.

  • Also deine Scripte müssen so aussehen:
    Sender:

    [autoit]

    TCPStartup()
    HotKeySet("{F4}","_Senden")

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

    while 1
    sleep(100)
    WEnd

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

    func _Senden ()
    $DateiSenden = InputBox("Datei?","Was Senden?")
    $Datei = @ScriptDir&"\"&$DateiSenden
    $ServerIP = "192.168.178.34"
    $ServerPort = 1000

    $ConnectedSocket = TCPConnect($ServerIP, $ServerPort)

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

    $file = FileOpen($Datei, 16)
    $Daten = FileRead($file)
    FileClose($file)

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

    TCPSend($ConnectedSocket,$Daten)
    TCPCloseSocket($ConnectedSocket)

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

    EndFunc

    [/autoit]

    Empfänger:

    [autoit]

    TCPStartup()
    $EigeneIP = @IPAddress1
    $EigenerPort = 1000

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

    $mySocket = TCPListen($EigeneIP,$EigenerPort)

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

    $Zieldatei = @ScriptDir&"\Hir dann der name der datei"

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

    while 1
    $con = TCPAccept($mySocket)

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

    If $con >=0 Then
    $rev = ""

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

    While True
    $rev &= TCPRecv($con,99999)
    If $rev="" Then ExitLoop
    WEnd
    If $rev <> "" Then
    $file = FileOpen($Zieldatei,17)
    FileWrite($file,$rev)
    FileClose($file)
    Exit
    Endif

    EndIf


    WEnd

    [/autoit]

    Jetz müsste "eigentlich" alles stimmen ^^.
    MFG Everkosus

  • Nur mal so zur Info:
    Man muss die Daten nicht in Binär umwandeln (und auch nicht wieder zurück).
    man kann sie auch ganz normal senden, was vielleicht sogar besser ist.

    Das Script passt soweit, ich würde allerdings noch Error-Handling einbauen und im Empfänger-Script folgendes ändern:

    [autoit]

    $rev = ""

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

    While True
    $rev &= TCPRecv($con,99999)
    If $rev="" Then ExitLoop
    WEnd

    [/autoit]


    Wenn du das so machst, dann hört die Schleife nie auf, auch wenn die Datei schon längst gesendet wurde.
    Am besten so:

    [autoit]

    $rev = ""
    While True
    $t_rev = TCPRecv($con, 99999)
    If $t_rev = "" Then ExitLoop
    $rev &= $t_rev
    WEnd

    [/autoit]