Server Client Datei Empfang schlägt fehl FileRead gibt error 0 zurück

  • hay hay,

    beim erstellen eines server <-> client Scripts sind mir mindestens ein fehler unterlaufen :rolleyes:
    Edit:
    Client script auf switch umgeschrieben leider empängt er den namen jetzt in der hauptschleife und nicht in der schleife wo er sie braucht

    Server:
    funktion GETFileList zeigt erst beim zweiten klicken die liste manchmal auch beim ersten Edit: Erledigt
    funktion GETFile empfängt nicht da der Dateiname beim client nicht ankommt bzw in der falschen schleife
    funktion GETFileBig geht im moment gar nicht da sie nich wie GETFileList auf fast anhieb ging

    Client:
    GetFile func empfängt Dateinamen nicht

    im \rar\ Ordner sind 6 Beispiel Dateien eine ~ 50mb und 5x ~ 10 bis 150 kb

    Server:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)
    Opt("GUIDataSeparatorChar", "|")
    Opt('MustDeclareVars', 1)
    #region ### START Koda GUI section ### Form=d:\users\eisregen\desktop\autoit scripts\rar archive\neuer ordner\datei senden\server.kxf
    Global $Form1 = GUICreate("Server GUI", 377, 223, 342, 291)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    Global $recvfile = GUICtrlCreateList("", 0, 8, 137, 201)
    GUICtrlSetLimit(-1, 200) ; to limit horizontal scrolling
    Global $Button1 = GUICtrlCreateButton("Get Big", 155, 96, 75, 25)
    GUICtrlSetOnEvent(-1, "GETFileBig")
    Global $Button2 = GUICtrlCreateButton("Get File", 155, 136, 75, 25)
    GUICtrlSetOnEvent(-1, "GETFile")
    Global $Button3 = GUICtrlCreateButton("Del File", 155, 184, 75, 25)
    ;~ GUICtrlSetOnEvent(-1, "Button3Click")
    Global $Button4 = GUICtrlCreateButton("Start Server", 155, 11, 75, 25)
    GUICtrlSetOnEvent(-1, "StartServer")
    Global $Button5 = GUICtrlCreateButton("Get File List", 155, 56, 75, 25)
    GUICtrlSetOnEvent(-1, "GETFileList")

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

    Global $RecvBig = GUICtrlCreateList("", 248, 8, 121, 201)

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

    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###
    StartServer()
    While 1
    Sleep(100)
    WEnd

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

    Func StartServer()
    TCPStartup()
    Global $IP = InputBox("IP", "Bitte Server IP eingeben.", "127.0.0.1")

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

    Global $Connection = TCPConnect($IP, 4412)
    If $Connection < 0 Then
    MsgBox(16, "Error", "Konnte keine Verbindung herstellen!")
    _Exit()
    EndIf
    EndFunc ;==>StartServer

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

    Func GETFileBig()
    ;~ GETFileList()
    TCPSend($Connection, "FileBig")
    While 1
    Local $Resv = TCPRecv($Connection, 8192)
    If @error Then
    MsgBox(16, "Error", "Verbindung unterbrochen!")
    ExitLoop
    EndIf
    Sleep('500')
    ;~ GUICtrlSetData($RecvBig, "")
    GUICtrlSetData($RecvBig, $Resv)
    ConsoleWrite($Resv)
    ExitLoop
    WEnd
    EndFunc ;==>GETFileBig
    Func GETFile()
    Local $Resvgetfile = -1
    TCPSend($Connection, "GetFile")
    Local $filetoget = GUICtrlRead($recvfile)
    Sleep('500')
    TCPSend($Connection, $filetoget)
    Do
    Local $Resvgetfile = TCPRecv($Connection, 8192)
    Until $Resvgetfile <> -1
    ConsoleWrite($Resvgetfile)
    If $Resvgetfile = "GO" Then
    ConsoleWrite('resv file')
    While 1
    Local $Resvgetfile = TCPRecv($Connection, 8192, 1)
    If @error Then
    FileWrite(@ScriptDir & "\get\" & GUICtrlRead($recvfile), $Resvgetfile)
    MsgBox(16, "Error", "Verbindung unterbrochen!")
    ExitLoop
    EndIf
    FileWrite(@ScriptDir & "\get\" & GUICtrlRead($recvfile), $Resvgetfile)
    ExitLoop
    WEnd
    EndIf
    EndFunc ;==>GETFile

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

    Func GETFileList()
    TCPSend($Connection, "List")
    While 1
    Local $Resv = TCPRecv($Connection, 8192)
    If @error Then
    MsgBox(16, "Error", "Verbindung unterbrochen!")
    ExitLoop
    EndIf
    Sleep('100')
    GUICtrlSetData($recvfile, "")
    GUICtrlSetData($recvfile, $Resv)
    ExitLoop
    ;~ ConsoleWrite($Resv)
    WEnd
    EndFunc ;==>GETFileList

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

    Func Form1Close()
    _Exit()
    EndFunc ;==>Form1Close
    Func RecvBigClick()
    GUICtrlSetData($recvfile, "Item1|Item2|Item3|Item4|Item5")
    EndFunc ;==>RecvBigClick
    Func recvfileClick()

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

    EndFunc ;==>recvfileClick

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

    While 1
    Local $Resv = TCPRecv($Connection, 8192)
    If @error Then
    MsgBox(16, "Error", "Verbindung unterbrochen!")
    _Exit()
    EndIf
    If $Resv = "SF" Then
    While 1
    $Resv = TCPRecv($Connection, 8192, 1)
    If @error Then
    FileWrite("Datei.exe", $Resv)
    MsgBox(16, "Error", "Verbindung unterbrochen!")
    ExitLoop
    EndIf
    ;~ FileWrite("Datei.exe", $Resv)
    WEnd
    EndIf
    WEnd

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

    Func _Exit()
    TCPShutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Client V2 :

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>
    #include<File.au3>
    ;~ #RequireAdmin
    Opt('MustDeclareVars', 1)
    Global $IP = "127.0.0.1"
    Global $FileBig = ""

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

    _verbindung()

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

    Func _verbindung()
    TCPStartup()
    Global $Socket = TCPListen($IP, 4412, 1)

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

    Do
    Global $Connection = TCPAccept($Socket)
    Until $Connection <> -1
    EndFunc ;==>_verbindung

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

    While 1
    Local $Resv = TCPRecv($Connection, 8192)
    Switch $Resv
    Case "end"
    _restart()
    Case "FileBig"
    _FileBig()
    Case "GetFile"
    _GetFile()
    Case "List"
    _List()
    Case Else
    _debug()
    EndSwitch
    WEnd

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

    Func _restart()
    TCPShutdown()
    ConsoleWrite("TCP Restart")
    Sleep('1000')
    ;~ _verbindung()
    Exit
    EndFunc ;==>_restart

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

    Func _debug()
    ConsoleWrite($Resv)
    EndFunc ;==>_debug

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

    Func _List()
    Local $FileList = _FileListToArray(@ScriptDir & "\rar\", "*", 1)
    _ArrayDelete($FileList, 0)
    Local $FileListString = _ArrayToString($FileList, "|")
    TCPSend($Connection, $FileListString)
    EndFunc ;==>_List

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

    Func _FileBig()
    Local $FileList = _FileListToArray(@ScriptDir & "\rar\", "*", 1)
    _ArrayDelete($FileList, 0)
    For $i = 0 To UBound($FileList) - 1
    $FileBig &= FileGetSize(@ScriptDir & "\rar\" & $FileList[$i])
    $FileBig = $FileBig & "|"

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

    Next
    ;~ $FileListString = _ArrayToString($File, "|")
    TCPSend($Connection, $FileBig)
    ConsoleWrite($FileBig)
    EndFunc ;==>_FileBig

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

    Func _GetFile()
    Local $Resvname = -1
    Do
    $Resvname = TCPRecv($Connection, 8192,0)
    Until $Resvname <> -1
    Sleep('100')
    TCPSend($Connection, "GO")
    Sleep('500')
    Local $File = FileOpen(@ScriptDir & "\rar\" & $Resvname, 16)
    If $File = -1 Then
    EndIf

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

    While 1
    Local $Read = FileRead($File, 2048)
    If @error Then
    FileClose($File)
    ExitLoop
    EndIf
    TCPSend($Connection, $Read)
    If @error Then
    FileClose($File)
    ExitLoop
    EndIf
    WEnd
    EndFunc ;==>_GetFile

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

    ;~ While 1
    ;~ TCPSend($Connection, "SF")
    ;~ While 1
    ;~ $Read = FileRead($File, 2048)
    ;~ If @error Then
    ;~ FileClose($File)
    ;~ Exit
    ;~ EndIf
    ;~ TCPSend($Connection, $Read)
    ;~ If @error Then Exit
    ;~ WEnd
    ;~ WEnd

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

    Neue GETFileList() Func:

    Spoiler anzeigen
    [autoit]

    Func GETFileList()
    TCPSend($Connection, "List")
    Local $Resvlist = -1
    While 1
    Do
    Local $Resvlist = TCPRecv($Connection, 8192)
    Until $Resvlist <> -1
    If @error Then
    MsgBox(16, "Error", "Verbindung unterbrochen!")
    ExitLoop
    EndIf
    Sleep('100')
    GUICtrlSetData($recvfile, "")
    GUICtrlSetData($recvfile, $Resvlist)
    ExitLoop
    ;~ ConsoleWrite($Resv)
    WEnd
    EndFunc ;==>GETFileList

    [/autoit]

    meine Autoit Kenntnisse sind naja so ok :S
    bin aber auch für hinweise die mich zum Fehler führen dankbar damit ich selbst nen bissl gefordert bin
    im client und server die letzten beiden while schleifen sind das grundgerüst vomit ich angefangen hab, thx an tja an wehn weiß nima habs auf googl gefunden aber danke
    dann noch ne gute nacht oder morgen je nachdem
    Gruß Eisregen

    2 Mal editiert, zuletzt von Eisregen04 (4. September 2012 um 16:58)

  • Ich muss zugeben ich habe deinen Post + Quellcode nur überflogen, aber was mir direkt aufgefallen ist, ist folgendes: In deinem Server-Script beginnst du in Zeile 29 eine Endlos-Schleife, die so weit ich das überblicken kann KEINE Abbruchbedingung besitzt. Daher ist es unmöglich, dass deine eigentliche Hauptschleife in Zeile 114 jemals aufgeführt wird. Ich verweise hier gerne nochmal auf dieses Tutorial von chesstiger, in dem die Grundlegende Strukturierung von Skripten ziemlich einfach erklärt wird... ;) Denn wenn du all deine Funktionen in einem 'Block' am Ende deines Scripts 'gelagert' hättest, würde so etwas ziemlich schnell auffallen... :P

    LG
    Christoph :)

  • ja Sauber schreiben is nich so meine stärke

    Zitat

    im client und server die letzten beiden while schleifen sind das grundgerüst vomit ich angefangen hab, thx an tja an wehn weiß nima habs auf googl gefunden aber danke


    die letzten beiden while schleifen hab ich nur als Ausgangspunkt im original im script behalten und sind fürs script an sich nutzlos da sie nie aufgerufen werden müssen da sie in bearbeiteter vorm weiter oben stehen

    GETFileList() empfängt jetzt beim ersten klicken die liste

    Spoiler anzeigen
    [autoit]

    Func GETFileList()
    TCPSend($Connection, "List")
    Local $Resvlist = -1
    While 1
    Do
    Local $Resvlist = TCPRecv($Connection, 8192)
    Until $Resvlist <> -1
    If @error Then
    MsgBox(16, "Error", "Verbindung unterbrochen!")
    ExitLoop
    EndIf
    Sleep('100')
    GUICtrlSetData($recvfile, "")
    GUICtrlSetData($recvfile, $Resvlist)
    ExitLoop
    ;~ ConsoleWrite($Resv)
    WEnd
    EndFunc ;==>GETFileList

    [/autoit]

    Edit 1
    nach einigen debug to console im clienten hat sich der fileread error 0 zu einem error 1 geändert da fielopen die datei nicht öffnen kann denke durch falschen empfangen namen
    Edit 2
    jop dateiname kommt nicht an

    2 Mal editiert, zuletzt von Eisregen04 (4. September 2012 um 13:42)

  • Achso okay das hatte ich dann wohl übersehen... :whistling:
    Generell würde ich dir aber empfehlen deine Scripte etwas umzubauen, denn wenn mit TCP gearbeitet wird ist es meist besser die Pakete intern 'unvorbereitet' zu empfangen, da sich ansonsten (wenn mal ein wichtiges Paket verloren geht oder fehlerhafte Pakete ankommen) das gesamte Programm aufhängen wird, wenn man nicht alles drei mal absichert... Daher wäre es zu empfehlen nach dem alles gestartet/erstellt/verbunden wurde in eine Hauptschleife über zu gehen, die ALLE Pakete empfängt und dann eben mit einem Switch nach eigenen 'Befehlen' sortiert. Möchtest du dann eine zum Beispiel eine Liste aller laufenden Prozesse anfordern, sendest du ein Paket mit dem entsprechenden Befehl an das Gegenüber und dieses schickt die Antwort dann zurück, wenn es die Antwort ganz erstellt/ausgeführt hat. Das hat dann den Vorteil, dass dein Script sich nicht aufhängt wenn mal eine Antwort etwa länger braucht oder ausbleibt. Außerdem lassen sich so prima auch mehrere Befehle/Pakete schnell nacheinander 'in Auftrag geben' da eben nicht speziell auf die Antwort gewartet wird... ;)

    LG
    Christoph :)

  • also einma komplet umschreiben :rolleyes: ^^
    naja ohne Fleiß kein preis heißt es ja immer
    werd dann meinen ersten beitrag editieren sobald ich das mit switch umgesetzt habe

  • so client is umgeschrieben
    Dateiname kommt nur in der falschen schleife an


    also dateiname kommt an

    wenn ich filedir selber ausschreibe gehts
    wenn ich $filedir nutze kommt error -1

    test Script:

    Spoiler anzeigen
    [autoit]


    Local $a = @ScriptDir
    Local $Resvname = '31-08.rar'
    Local $filedir = StringFormat('"'& $a & '\\' & 'rar\' & $Resvname & '"')

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

    $file = FileOpen($filedir,16)
    $fileread = FileRead($file)
    FileWrite(@ScriptDir & '\get\test.rar',$fileread)
    ConsoleWrite('error: ' & @error & @CRLF)
    ConsoleWrite($fileread)
    FileClose($file)

    [/autoit]

    4 Mal editiert, zuletzt von Eisregen04 (4. September 2012 um 22:31)

  • Wozu machst du den Umweg über StringFormat?

    Spoiler anzeigen
    [autoit]

    Local $Resvname = '31-08.rar'
    Local $FileDir = @ScriptDir & '\\rar\' & $Resvname

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

    $FileHandle = FileOpen($FileDir, 16)
    $FileRead = FileRead($FileHandle)
    FileWrite(@ScriptDir & '\get\test.rar', $FileRead)
    ConsoleWrite('error: ' & @error & @CRLF)
    ConsoleWrite($FileRead)
    FileClose($FileHandle)

    [/autoit]

    ;)

    LG
    Christoph :)

  • auch ohne StringFormat schlägt FileOpen fehl ( -1 )

    local in einem script gehts wenn ichs local mit zwei scripts mache gehts nich

    PS. @ Christoph54
    ein \ zufiel da kein StringFormat mehr genutzt wird

    [autoit]

    Local $FileDir = @ScriptDir & '\\rar\' & $Resvname

    [/autoit]