• Hallo @all!
    Da ich mir mal ein ChatProgramm mit allen Schikanen machen wollte, war das Verschicken von Dateien unverzichtbar.
    Dazu hab ich mir 2 Funktionen gemacht
    - _TCP_FileSend
    - _TCP_FileRecv
    Vielleicht kann sie ja jemand brauchen...

    UDF:
    [autoit]


    ; #FUNCTION# ======================================================================================
    ; Name ..........: _TCP_FileRecv()
    ; Description ...: This function recives a file and save it on a user defined path.
    ; Syntax ........: _TCP_FileRecv($iSocket, $sSavePath)
    ; Parameters ....: $iSocket - The connected socket
    ; $sSavePath - The path you want to save the file
    ; Return values .: Success Return 1
    ; Failure:
    ; |-1: Socket = -1
    ; |-2: SavePath = ""
    ; |-3: SavePath does not exist
    ; |-4: No data was incoming
    ; |-5: Incoming data wasn´t a file
    ; Author ........: GE IXI TIM
    ; Remarks .......: This function can only be used with _TCP_FileSend.
    ; Link ..........: http://www.autoit.de
    ; Example .......:
    ; =================================================================================================

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

    Func _TCP_FileRecv($iSocket, $sSavePath)
    Local $hFile, $sRecv
    If $iSocket = -1 Then Return -1
    If $sSavePath = "" Then Return -2
    If StringRight($sSavePath, 1) <> "\" Then $sSavePath &= "\"
    If Not FileExists($sSavePath) Then Return -3
    $sRecv = TCPRecv($iSocket, 999999)
    If $sRecv <> "" Then
    $aRecv = StringSplit($sRecv, "<||>", 1)
    if $aRecv[1] <> "FILE" Then Return -5
    $hFile = FileOpen($sSavePath & $aRecv[2], 18)
    FileWrite($hFile, $aRecv[3])
    Return 1
    EndIf
    Return -4
    EndFunc

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _TCP_FileSend()
    ; Description ...: This function sends a file
    ; Syntax ........: _TCP_FileSend($iSocket, $sFilePath[, $sFileName = ""])
    ; Parameters ....: $iSocket - The connected Socket
    ; $sFilePath - The path to the file
    ; $sFileName - [optional] Name of the file. ("" = Default filename) (default:"")
    ; Return values .: Return 1
    ; Failure:
    ; |-1: Socket = -1
    ; |-2: FilePath does not exist
    ; |-3: Error with TcpSend
    ; Author ........: GE IXI TIM
    ; Remarks .......: This function can only used with _TCP_FileRecv
    ; Link ..........: http://www.autoit.de
    ; Example .......:
    ; =================================================================================================

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

    Func _TCP_FileSend($iSocket, $sFilePath, $sFileName = "")
    Local $hFile, $sFile
    If $iSocket = -1 Then Return -1
    If Not FileExists($sFilePath) Then Return -2
    If $sFileName = "" Then
    $aSplit = StringSplit($sFilePath, "\")
    $sFileName = $aSplit[$aSplit[0]]
    EndIf
    $hFile = FileOpen($sFilePath, 16)
    $sFile = FileRead($hFile)
    FileClose($hFile)
    TCPSend($iSocket, "FILE<||>" & $sFileName & "<||>" & $sFile)
    If @error Then Return -3
    Return 1
    EndFunc

    [/autoit]
    Beispiel:
    [autoit]


    ;----Server, start me first----
    #include "_TcpFile.au3"
    Global $ip = @IPAddress1, $port = 11111, $sucess = 0
    TCPStartup()
    Global $MainSocket = TCPListen($ip, $port), $conSocket = -1
    While $conSocket = -1
    $conSocket = TCPAccept($MainSocket)
    WEnd
    MsgBox(64, "Connection created", "")
    While 1
    $sucess = _Tcp_FileRecv($conSocket, @DesktopDir)
    if $sucess = 1 Then
    TCPShutdown()
    Exit
    EndIf
    Sleep(10)
    WEnd

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

    ;--Client
    #include "_TcpFile.au3"
    Global $ip = @IPAddress1, $port = 11111, $ConSocket = -1
    TCPStartup()
    While $ConSocket = -1
    $ConSocket = TCPConnect($ip, $port)
    WEnd
    $file = FileOpenDialog("Choose a File", @DesktopDir, "(*.*)")
    _Tcp_FileSend($ConSocket, $file, "")
    Sleep(5000)
    TCPShutdown()
    Exit

    [/autoit]

    ganzes Paket: autoit.de/wcf/attachment/9350/

    lg. tim

  • danke für das Lob :thumbup:
    Ih werd versuchen die UDF noch erwas zu erweitern...
    Kennt jemand eine Möglichkeit wie man vllt die Werte der verschickten Bytes feststellen kann?
    Weil ein Fortschrittsbalken wäre doch recht nützlich...^^
    Kann man das vielleicht über $sRecv bewerkstelligen?
    Bin für alles offen :D

    lg tim

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]
  • (der style von dem ist echt langweilig, und die übertragungsrate , naja)

    Ich hasse solche äußerungen :cursing:

    [autoit]

    Const $Download <> $Upload

    [/autoit]

    Wenn du nun eine 6000 Leitung hast, kannst du zwar mit 600 - 700kb/s downloaden, aber halt nicht Uploaden :!: Merke: Bis zu einer bestimmten schwelle hängt das von deiner bzw der Geschwindigkeit des Empfängers ab. Wenn Sprenegr mir z.b. was schickt, schickt er mit 1,5kb/s hingegen ich mit über 60kb/s

  • Zitat von »black_skorpi«
    (der style von dem ist echt langweilig, und die übertragungsrate , naja)

    Ich hasse solche äußerungen :cursing:

    warum ist das so schlimm?? ich benutz es doch... ich finde nur, dass es ein bisschen mehr style vertragen könnte, und der server ist wirklich nicht grade der schnellste (ok sehr viele benutzen es aber trotzdem...)

    Edit1:

    (sehr viele benutzer aber trotzdem...)

    was habe ich den da für einen schwachsinn geschrieben xD

  • und der server ist wirklich nicht grade der schnellste (ok sehr viele benutzer aber trotzdem...)

    Ließt du, was ich schreibe?[Blockierte Grafik: http://www.philognosie.net/article/772/problem_lesen.jpg]

    Zitat
    [autoit]

    Const $Download <> $Upload

    [/autoit]

    Den ganzen rest ahbe ich nciht nochmal zitiert....

  • da muss ich ihm aber recht geben .. klar ist download nicht gleich upload .. aber wenn ich auf mein ftp server uploade dann hab ich ne speed von 60kb/s bei icq immer nur 15kb/s auch wenn der empfänger ne 16.000 leitung hat !!!

  • da muss ich ihm aber recht geben .. klar ist download nicht gleich upload .. aber wenn ich auf mein ftp server uploade dann hab ich ne speed von 60kb/s bei icq immer nur 15kb/s auch wenn der empfänger ne 16.000 leitung hat !!!

    hmm, ich habe z.b. für FTP immer n upstream von 60 - 70kb/s und bei ICQ versende ich in genau der gleichen geschwindigkeit... habe auch ncohnie Probleme damit gehabt, das der mal unter 50kb/s gekommen wäre oder so

  • ach haste auch 1mb DSL :D .. ist schon echt blöd^^

    ne aber bei mir ist des oft so dass ich mit nur 25% sende .. keine ahnung warum aber das dauert dann manchmal echt ewig .. lieber aufn server packen und den link schicken

  • *haha...

    [autoit]

    $hFile = FileOpen($sFilePath, 16)
    $sFile = FileRead($hFile)
    FileClose($hFile)
    TCPSend($iSocket, "FILE<||>" & $sFileName & "<||>" & $sFile)

    [/autoit]

    Hab letztens versucht, nen Spiel .iso rüberzuschicken, weil ich kein bock hatte, die externe Festplatte anzuschließen..

    ERROR... Speicherüberschreitung...

    Problem 1: Das File kann man nicht zu 100% auslesen, wenn es 7 GB groß ist...
    Problem 2: wenn man dann die Informationen hat, die man ausgelesen hat, kann man sie nicht ALLE auf Einmal schicken...

    Lösung...??

    Kann mir jemand die Probleme Lösen..?:) :rock:

  • In der UDF ist eine maximale Zeichenlänge von 999999 Zeichen angegeben die du mit 7GB deutlich überschreitest, deshalb der Fehler. Die Lösung sollte sein, diesen Wert zu erhöhen.

    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.

  • oder schrittweises Auslesen einer Datei... Dann wird eben immer ein anderer Bereich ausgelesen und versendet...

    Aber WIE...?

  • Zitat

    oder schrittweises Auslesen einer Datei... Dann wird eben immer ein anderer Bereich ausgelesen und versendet...
    Aber WIE...?

    Mit

    [autoit]

    FileSetPos()

    [/autoit]

    setzt man einen Zeiger in einer Datei, ab dem man dann einen bestimmten Datenbereich auslesen kann. Damit ist es auch möglich, Sektorenweise einen Datenträger auszulesen.