TCP Datei senden und bytes ausrechnen

  • Hi

    ich hab hier ein simplen Code (siehe unten). Ich habe einen TCP Code geschrieben wo die Datei gesendet wird. Die Datei wird empfangen. Und zwar hab ich eine kleine Videodatei ca 28mb als Testdatei genommen. Wenn sie geschickt wird kann man sie auch anschauen.

    Mein Problem ist aber, ich möchte gerne, der das sendet (zur Zeit Client) die restlichen bytes (später in Kbytes) sehen kann bzw auch später Regeln kann.
    Nun ja, die do until schleife läuft ganze Zeit

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    HotKeySet("{q}", "_exit")
    func _exit()
    Exit
    EndFunc

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

    Global $FileSendSizeLeft = 0, $TCPSendedBytes = 0

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

    TCPStartup()
    $TCPConnect = TCPConnect(@IPAddress1, 23322)

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

    if($TCPConnect < 1) Then
    ConsoleWrite("Verbunden fehlgeschlagen" & @CRLF)
    exit
    Else
    ConsoleWrite("Verbunden. Sende Datei" & @CRLF)
    EndIf

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

    $sFile = "C:\Users\Nickname\Documents\AutoIT Scripte\Filesender\video.flv"
    $FileOpenBinary = FileOpen($sFile,16)
    $FileRead = FileRead($FileOpenBinary)
    $FileSendSizeLeft = BinaryLen($FileRead)

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

    do
    $TCPSendedBytes = TCPSend($TCPConnect, $FileRead)
    ConsoleWrite("Gesendete Bytes: " & $TCPSendedBytes & @CRLF)
    $FileSendSizeLeft = ($FileSendSizeLeft-$TCPSendedBytes)
    ConsoleWrite("Noch übriggebliebene Bytes: " & $FileSendSizeLeft & @CRLF)
    sleep(100)
    Until $FileSendSizeLeft <= 0
    exit

    [/autoit]


    Ich bekomme als Meldung das hier:

    Zitat

    Verbunden. Sende Datei
    Gesendete Bytes: 29583166
    Noch übriggebliebene Bytes: 0


    Total komisch. Wenn ich jetzt auskommentiere würde die Schleife nicht beendet werden. Die Datei wird dann weiter gesendet aber die Meldung wäre dann auch die gleiche Bytes die genoch übrig geblieben sind. Eigentlich müsste ja doch zurückgegeben werden wieviel er tatsächlich er gesendet hat und nicht muss oder? Das kann ich ja so oder so mit binarylen lesen.

    server ist nur einfach

    [autoit]

    Do
    $TCPRecv = TCPRecv($TCPAccept,1024)
    If @error Then ExitLoop
    FileWrite("test.flv",$TCPRecv)
    sleep(10)
    Until @error
    ConsoleWrite("Verbindung beendet" & @CRLF)
    exit

    [/autoit]

    EDIT: Achja, das sind 2 verschiedene Scripts natürlich. Also die Codes sind nicht auf der selben .au3 Datei.

    2 Mal editiert, zuletzt von MaZy (28. März 2011 um 21:03)

  • Ist schon richtig so wie ich das sehe allerdings sendest du die 28mb in einem Send Aufruf was ich nen bisschen viel finde versuch mal immer nur einen buffer zu senden z.B. so:

    [autoit]


    $FileOpenBinary = FileOpen($sFile,16)
    $FileRead = FileRead($FileOpenBinary)
    $FileSendSizeLeft = BinaryLen($FileRead)

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

    Dim $Buffer[1024]
    $Buffer = FileRead($sFile,1024)

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

    do
    $TCPSendedBytes = TCPSend($TCPConnect, $Buffer)
    ConsoleWrite("Gesendete Bytes: " & $TCPSendedBytes & @CRLF)
    $FileSendSizeLeft = ($FileSendSizeLeft-$TCPSendedBytes)
    ConsoleWrite("Noch übriggebliebene Bytes: " & $FileSendSizeLeft & @CRLF)
    $Buffer = FileRead($sFile,1024)
    sleep(100)
    Until $FileSendSizeLeft <= 0
    exit

    [/autoit]
  • Und setz dein TCPResev auf binärempfang,
    Wie das geht, steht ausführlich in der hilfe

  • Danke für deine Hilfe und Idee Sortoc. Jedoch nur deine Idee ist richtig, aber dein Code falsch :D. Bei dir wird leider nur die ersten 1024 zeichen gelesen und das jedes mal.
    Hab mal heute weiter daran gearbeitet.

    Nun hab ich es richtig :)
    Indem ich so gemacht hab
    Global $SendedBytesSumme = 1
    $buffer = BinaryMid($FileRead, $SendedBytesSumme, $UploadRate)
    $SendedBytesSumme += $TCPSendedBytes

    Nun ganze Code hier.

    Spoiler anzeigen
    [autoit]


    $sFile = "C:\Users\Nickname\Documents\AutoIT Scripte\Filesender\video.flv"
    $FileOpenBinary = FileOpen($sFile,16)
    $FileRead = FileRead($FileOpenBinary)
    $FileSize = BinaryLen($FileRead)
    $FileSendSizeLeft = $FileSize
    $UploadRate = 102400 ; 1024 bytes = 1 Kb, 1024*1024 = 1048576 bytes = 1024 Kb = 1 Mb
    $buffer = BinaryMid($FileRead, $SendedBytesSumme, $UploadRate)
    ConsoleWrite("Datei, video.flv " & $FileSize/1024 & " wird gesendet" & @CRLF)
    sleep(1000)

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

    do
    $TCPSendedBytes = TCPSend($TCPConnect, $Buffer)
    $FileSendSizeLeft -= $TCPSendedBytes
    $SendedBytesSumme += $TCPSendedBytes
    $Prozent = 100*$SendedBytesSumme/$FileSize
    GUICtrlSetData($PS1, $Prozent)
    ;~ ConsoleWrite("Gesendete Kb: " & round(($TCPSendedBytes/1024),3) & @CRLF)
    ;~ ConsoleWrite("Noch übriggebliebene Kb: " & round(($FileSendSizeLeft/1024),2) & @CRLF)
    ;~ ConsoleWrite("Prozess bei: " & round($Prozent,2) & "%" & @CRLF)
    $buffer = BinaryMid($FileRead, $SendedBytesSumme, $UploadRate)
    sleep(50)
    Until $FileSendSizeLeft <= 0

    [/autoit]


    Und bei TCPRecv sollte man schon auf hohe Zeichen setzen. Hab 1Mb gemacht.

    Mein Problem ist nur,dass meine CPU Auslastung bis zu 50% hoch kommt. Weiß nicht genau woran das liegt. Hab sogar mit 100 bzw 500 sleep versucht.. aber das ist meiner Meinung nach zu hoch und fängt an zu stottern. Naja noch kann ich damit leben :P

  • Ich denke das liegt gerade daran das du 1 MB versendest, wenn ich sende oder empfange mach ich normalerweiße 2048 bytes.