Die erste File Over TCP Funktion

    • Offizieller Beitrag

    Hallo!

    Ich präsentiere ^^: die erste File Over TCP Funktion :)
    Das Projekt besteht aus 2 Funktionen:

    _FileSend

    Spoiler anzeigen
    [autoit]

    #include-once

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

    ;===============================================================================
    ;
    ; Function Name: _FileSend
    ; Description:: Sending a File to an Server (See _FileReceive)
    ; Parameter(s):
    ;$sFile : The File to send
    ;$IP : The target IP Adress
    ;$PORT [Optional] : The Port to use (must be the same as by _FileRecevie!!)
    ;$iSplash [Optional] : 1(defaul) = show SplashText
    ; 0 = dont show SplashText
    ;$iWaitWhileConnected [Optional] : 0 = If TCPConnect faild (@error) Return with error Code 2
    ; 1(Default) = If TCPConnect faild put it in a while until connected
    ; Requirement(s): -
    ; Return Value(s): On Succes Return 1
    ; On faild Return -1 and @error code 1-3:
    ; @error = 1: File not exist
    ; @error = 2: TCPConnect faild (only able if $iWaitWhileConnected <> 1)
    ; @error = 3: Faild to Open File
    ; @error = 4: A Connectionproblem while sending
    ; Author(s): GtaSpider
    ;
    ;===============================================================================

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

    Func _FileSend($sFile, $IP, $PORT = 4324,$iSplash=1, $iWaitWhileConnected = 1)
    Local $iMainSocket = -1, $sBuff, $iFileOp,$sRecv

    If Not FileExists($sFile) Then Return SetError(1,0,-1)
    If $iSplash Then $iSplash = SplashTextOn('','Try To Connect...',200,20,-1,-1,1)
    TCPStartup()

    If Number($iWaitWhileConnected) = 1 Then
    While $iMainSocket = -1
    $iMainSocket = TCPConnect($IP, $PORT)
    WEnd
    Else
    $iMainSocket = TCPConnect($IP, $PORT)
    If @error Then Return SetError(2, 0, -1)
    EndIf
    If $iSplash Then ControlSetText($iSplash,'','Static1','Read File...')
    $iFileOp = FileOpen($sFile, 16)
    If @error Then Return SetError(3,0,-1)
    $sBuff = Binary(StringTrimLeft($sFile,StringInStr($sFile,"\",-1,-1))&",")&FileRead($iFileOp)
    FileClose($iFileOp)
    If $iSplash Then ControlSetText($iSplash,'','Static1','Sending File...')
    While BinaryLen($sBuff)
    $iSendReturn = TCPSend($iMainSocket, $sBuff)
    If @error Then Return SetError(4, 0, -1)
    TrayTip('',$iSendReturn,1)
    $sBuff = BinaryMid ($sBuff, $iSendReturn + 1, BinaryLen ($sBuff) - $iSendReturn)
    WEnd
    If $iSplash Then ControlSetText($iSplash,'','Static1','Succesfull!')
    TCPCloseSocket($iMainSocket)
    TCPShutdown()
    Sleep(1000)
    SplashOff()
    Return 1
    EndFunc

    [/autoit]


    _FileReceive

    Spoiler anzeigen
    [autoit]

    #include-once

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

    ;===============================================================================
    ;
    ; Function Name: _FileReceive
    ; Description:: Receives a File from an Client (See _FileSend)
    ; Parameter(s):
    ;$sFileName [Optional] : The Filename to save (if default or "" then using the original File Name)
    ;$IP [Optional] : The IP where the Server run, Default = @IPAdress1
    ;$PORT [Optional] : The Port to use (must be the same as by _FileSend!!)
    ;$iSplash [Optional] : 1(defaul) = show SplashText
    ; Requirement(s): -
    ; Return Value(s): On Succes Return 1
    ; On faild Return -1 and @error code 1-3:
    ; @error = 1: Error creating Listening socket on IP
    ; @error = 2: Faild to open file
    ; @error = 3: Faild to write file
    ; Author(s): GtaSpider
    ;
    ;===============================================================================

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

    Func _FileReceive($sFileName = '', $IP = @IPAddress1, $PORT = 4324,$iSplash=1)
    Local $iMainSocket, $iAccSocket = -1, $sBuff, $sRecv = "", $i = 0, $iFirstWhile = True
    TCPStartup()

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

    $iMainSocket = TCPListen($IP, $PORT)
    If @error Then Return SetError(1,0,-1)
    If $iSplash Then $iSplash = SplashTextOn('','Wait For Incoming...',200,20,-1,-1,1)
    While $iAccSocket = -1
    $iAccSocket = TCPAccept($iMainSocket)
    Sleep(50)
    WEnd
    $sBuff = Binary ($sBuff)

    If $iSplash Then ControlSetText($iSplash,'','Static1','Incoming...')

    While $sRecv = ""
    $sRecv = TCPRecv($iAccSocket, 2048, 1)
    $sRecv = BinaryToString ($sRecv)
    WEnd
    If $iSplash Then ControlSetText($iSplash,'','Static1','Receive File...')
    While $sRecv <> ""
    If StringInStr($sRecv, ',') And $iFirstWhile Then
    $sTmp = StringLeft($sRecv, StringInStr($sRecv, ",") - 1)
    $sRecv = StringTrimLeft($sRecv, StringLen($sTmp) + 1)
    If StringLen($sFileName) < 1 Then $sFileName = $sTmp
    $iFirstWhile = False
    EndIf
    $sBuff &= $sRecv
    $sRecv = BinaryToString (TCPRecv($iAccSocket, 2048, 1))
    If @error Then ExitLoop
    WEnd
    If $iSplash Then ControlSetText($iSplash,'','Static1','Write To File...')
    If FileExists($sFileName) Then
    $sTmp = StringSplit($sFileName, ".")
    If $sTmp[0] < 2 Then
    While 1
    $i += 1
    If Not FileExists($sFileName & "(" & $i & ")") Then
    $sFileName = $sFileName & "(" & $i & ")"
    ExitLoop
    EndIf
    WEnd
    Else
    While 1
    $i += 1
    If Not FileExists($sTmp[1] & "(" & $i & ")" & $sTmp[2]) Then
    $sFileName = $sTmp[1] & "(" & $i & ")." & $sTmp[2]
    ExitLoop
    EndIf
    WEnd
    EndIf
    EndIf
    $iFileOp = FileOpen($sFileName, 16 + 2)
    If @error Then Return SetError(2,0,-1)
    FileWrite($iFileOp, $sBuff)
    If @error Then Return SetError(3,0,-1)
    FileClose($iFileOp)
    If $iSplash Then ControlSetText($iSplash,'','Static1','Succesfull!')
    TCPCloseSocket($iAccSocket)
    TCPShutdown()
    Sleep(1000)
    Return 1
    EndFunc ;==>_FileReceive

    [/autoit]

    Die Send funktion sendet eine Datei zu einem Server.
    Die Receive funktion empfängt eine Datei von einem Client.

    Mehr erfahrt ihr in der udf beschreibung über den Funktionen.

    Man kann die beieden Funktionen nicht in einem Skript verwenden, da sie ja logischerweise beide Connecten müssen.

    Beispiele:

    _FileSend Beispiel:

    Spoiler anzeigen
    [autoit]

    _FileSend(@WindowsDir&"\cmd.exe",@IPAddress1);Sendet die datei cmd.exe an die IP adresse @IPAdress1(Also an die eigene)
    If @error Then MsgBox(48,"","Error: "&@error)
    _FileSend(@WindowsDir&"\cmd.exe","192.168.0.1",4444,0,0);Sendet die datei cmd.exe an die IP adresse 192.168.0.1 über port 4444, Splashtext wird nicht angezeigt und wenn er beim ersten mal Connecten fehlschlägt bricht er ab.
    If @error Then MsgBox(48,"","Error: "&@error)

    [/autoit]

    _FileReceive Beispiel:

    Spoiler anzeigen
    [autoit]

    _FileReceive();Speichert die datei mit dem Original namen ab, die IP ist @IPADress1, Port ist 4324 und der Splashtext wird gezeigt
    If @error Then MsgBox(48,"","Error: "&@error)
    _FileReceive("EineDatei.exe","192.168.0.1",4444,0);Speichert die datei mit dem Namen "EineDatei.exe" ab, die ip ist 192.168.0.1, der Port ist 4444 und der Splashtext wird nicht angezeigt
    If @error Then MsgBox(48,"","Error: "&@error)

    [/autoit]

    Bitte um anregungen und bugreport ;)

    Mfg Spider

  • wow super - funktioniert wirklich gut.

    Kann es sein, dass Dateien über 100 MB mit Fehler Nr. 4 abgebrochen werden?

    Wie aufwändig ist es vor dem eigentlichen Kopieren einen Dateivergleich über Datum/Größe zu machen? Dann könnte man ein Sicherungsverzeichnis über TCP aktuell halten.

    Nachtrag: der Vergleich kann gar nicht funktionieren, da die empfangene Datei das aktuelle Datum erhält.........

    Einmal editiert, zuletzt von Carsten (22. Juni 2007 um 14:58)

  • Hi

    Habe das ganze auch mal gerade ausprobiert... erstmal BIG RESPECKT an gtaspider^^
    Bei mir kommt es nur leider zu einem kleinem Problem...
    Habe versucht eine mp3 damit übers Netzwerk zu schicken, die im orginal 4,3 MB groß ist.

    Wenn ich sie aber übertragen habe kommen auf dem anderen rechner nur noch 1,4kB an...
    mache ich was falsch??(

    MFG chris:D

  • würd ma gern n screen sehen :D

    und wie schnell ist so die übertragung? sprich wieviel % des verfügbaren netzwerkes/verbindung kann gebraucht werden?

    Einmal editiert, zuletzt von K1773R (28. Oktober 2008 um 11:37)

  • @GTA

    lol sowas hab ich auch schon gemacht nur viel primitiver als dein script^^ respekt ist dir gut gelungen, nur ich würde noch folgende erweiterungen reinmachen:
    1. ein start plus 1 Endcode für die Übertragung reinmachen damit recive weiss jetzt wird die eine datei übertragen, jetzt die nächste usw
    2. die übertragung des dateinamens...

    Und noch ne frage, das ganze müsste ja natürlich auch mit UDP zu lösen sein, ich hab mal gehört das das "schneller" überträgt stimmt das?

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • @ Fireflyer, kommt drauf an, wo du die Funktion benutzt, ich denke mal dass wenn du das per Internet sendest wird das wohl keinen großen Unterschied machen, denn da wird die Bandbreite vom TCP - Protokol ausgenuzt. Habe mir auch mal eine TCPTransfer - Funk zusammen gescriptet, hatte eine Geschwindigkeit von über 1200 kb/s im lokalen Netzwerk jenachdem wie man sie eingestellt hatte.

    greetz DJ

    • Offizieller Beitrag

    Hallo

    @K1773R: Screen von ner UDF ohne GUI wird schwer :D
    Geschwidigkeit hab ich noch nicht ausgestestet, aber werd ich bald mal machen.
    FireFlyer: Danke :P Aber zu 1.: Ich wollte ja das immer nur eine Datei gesendet wird. Natürlich kann man das auch ausbauen, und dann TCPListen vor der UDF klemmen oder sowas... Und zu 2.: Wird doch :D Zeile 44 beim Send:

    [autoit]

    $sBuff = Binary(StringTrimLeft($sFile,StringInStr($sFile,"\",-1,-1))&",")&FileRead($iFileOp)

    [/autoit]


    Und Zeile 44-46 beim Recv:

    [autoit]

    $sTmp = StringLeft($sRecv, StringInStr($sRecv, ",") - 1)
    $sRecv = StringTrimLeft($sRecv, StringLen($sTmp) + 1)
    If StringLen($sFileName) < 1 Then $sFileName = $sTmp

    [/autoit]

    Mfg Spider

  • Zitat

    balour4324/tcp Balour Game Server

    würd ich doch einfach mal so ändern wie in meinem posting obendran ^^

  • habs gradma aus langeweille angeguckt. da giebts n riesen problem! wenn du n file übertragen willst, es wird nur ein teil des files übertragen. es konnte bisher nur eine txt und eine ini mit ca 4 zeilen übertragen. mehr hat es ned ausgehalten! ^^