Tcp Netzwerk... Help(zum dritten xD)

  • Naja hab in der Ganzen Zeit nun zum dritten mal meinen schönen TCP Code komplett umgecodet(gut sie waren nie sehr lang aber naja...^^)
    Im moment arbeite ich eigentlich nur am Server was mir aber auch schon Schwierigkeiten bereitet...
    Es ist so aufgebaut:
    Es existiert ein Mainserver, welcher als einzigster nach ausen hin geöffnet wird.
    Dazu gibt es dann mehrere Wing-server welche sozusagen als Funktionsserver dienen.
    Zum anfang habe ich es mit dem Hauptserver+1. Wingserver probiert.
    Ein Shutdown Server mit 2 einfachen befehelen...

    Hier mal mein Code:
    Main:

    Spoiler anzeigen
    [autoit]

    #include<date.au3>
    TCPStartup()
    $gui=GUICreate("Server is loading...",200,100)
    $komischeskeineahnungwas=GUICtrlCreateProgress(1,1,199,49)
    $Label=GUICtrlCreateLabel("Loading Includes...",1,50)
    Guisetstate()
    $xx=0
    $Timerdifftyp=1
    $datafurset="Loading Includes..."
    While 1
    GUICtrlSetData($komischeskeineahnungwas,$xx)
    Guictrlsetdata($Label,$datafurset)
    If GUIGetMsg()=-3 then Exit
    If $xx=0 Then
    #include<inc_consends.au3>
    $datafurset="Startup intern Servers..."
    EndIf
    If $xx=10 Then
    $Funcsocket=TCPListen("127.0.0.1",00001)
    $Paramsocket=TCPListen("127.0.0.1",00002)
    $PWsocket=TCPListen("127.0.0.1",00003)
    $datafurset="Start Accept for the Servers..."
    EndIf
    If $xx=20 Then
    $acc=TCPAccept($Funcsocket)
    $Paramsocke=TCPAccept($Paramsocket)
    $PWSocke=TCPAccept($PWsocket)
    $datafurset="Run Other Server..."
    EndIf
    If $xx=30 Then
    Run("Shutdown-Server.exe")
    $datafurset="Connect To Other Servers..."
    EndIf
    If $xx=40 Then
    $Shutdownserver=TCPConnect("127.0.0.1",26537)
    If $Shutdownserver=-1 Then
    MsgBox(0,"Can´t Connect to Shutdown Server","")
    Exit
    EndIf

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

    $datafurset="Load..."
    EndIf
    If $xx=100 Then
    GUIDelete($gui)
    ExitLoop
    EndIf
    $xx=$xx+10
    WEnd
    $Gui2=GUICreate("Log",300,200)
    $Funcinput=GUICtrlCreateInput("Enter your Function",1,1,149,49)
    $Paraminput=GUICtrlCreateInput("Param",1,50,149,49)
    $Buttom_normal=GUICtrlCreateButton("Run normal Command",150,1,149,49)
    $Buttom_spezial=GUICtrlCreateButton("Run spezial Command",150,50,149,49)
    $edit_log=GUICtrlCreateEdit("",1,100,299,99)
    GUISetState()
    While 1
    $Timer1=Timerinit()
    While $Timerdifftyp=1
    $Func=TCPRecv($acc,50)
    $param=TCPRecv($paramsocke,50)
    $ID_PW=TCPRecv($PWsocke,50)
    $Msg=GUIGetMsg($Gui2)
    If $Msg=$Buttom_normal Then
    $Func=GUICtrlRead($Funcinput)
    $param=GUICtrlRead($paraminput)
    EndIf
    If $msg = -3 then Tcpsend($Shutdownserver,"all")
    If $msg = $Buttom_spezial then
    $Func_spezial=GUICtrlRead($Funcinput)
    $Param_spezial=GUICtrlRead($Paraminput)
    #include<spezial.au3>
    EndIf
    If $Func = "Shutdown" then _shutdown()
    $Reaktionszeit=TimerDiff($Timer1)
    If $Reaktionszeit >= 20000 then $Timerdifftyp=0
    WEnd
    GUICtrlSetData($edit_log,Fileread("log.txt"))
    FileWrite("log.txt",_nowtime()&@CRLF)
    $Timerdifftyp=1
    WEnd

    [/autoit]


    Shutdown:

    Spoiler anzeigen
    [autoit]

    TCPStartup()
    $LShutServer=TCPListen("127.0.0.1",26537)
    $Accept=TCPAccept($LShutServer)
    While 1
    $recv=TCPRecv($accept,2046)
    If $recv="-h" then Shutdown(1)
    If $recv="all" Then
    ProcessClose("Server.exe")
    Exit
    EndIf
    WEnd

    [/autoit]


    Spezial.au3(besondere Adminbefehle)

    [autoit]

    If $Func_spezial="Clear_log" then FileDelete("log.txt")
    If $Func_spezial="Exit" then Exit

    [/autoit]


    Und ein Funktionsinclude wo noch nachweist wieviele rechte man hat.

    [autoit]

    Func _shutdown()
    If FileExists("1"&$ID_PW&".txt") Then
    TCPSend($Shutdownserver,$param)
    FileWrite("Config.txt",_NowDate & $ID_PW & $Func & $Param)
    EndIf
    EndFunc

    [/autoit]

    Problem der Wing bekommt keine Befehle vom Hauptserver...
    naja... schonmal thx fürs helfen *prob net finden kann*

  • Du darfst TCPConnect und TCPlisten nicht gleichzeitig in einem Skript haben
    TcpConnect ist für Clienten, d.h. dein Client muss ein EXTRA Skript sein...

  • Du darfst TCPConnect und TCPlisten nicht gleichzeitig in einem Skript haben

    das stimmt nicht, ich hab ein chat gescriptet der komplett funktioniert und da ist auch TCPConnect und TCPListen drinnen (in einem script) ;) .

    Mfg. PCKing


    Mein PC

    CPU: AMD FX 8350 8x4.00GHz
    Ram: 8GB DDR3
    Grafikkarte: Nvidia Geforce GTX 960 (4GB)
    Festplatten: 500GB SSD 1TB HDD
    Laufwerk: Blueray RW+ Brenner

  • Du darfst TCPConnect und TCPlisten nicht gleichzeitig in einem Skript haben
    TcpConnect ist für Clienten, d.h. dein Client muss ein EXTRA Skript sein...

    Wenn ein Script beides nicht gleichzeitig beinhalten darf wie soll dann z.B. bei einem Chat der Client die Antwort vom Server überhaupt erhalten können?
    Und bei meinem Aufbau brauch ich beides im hauptserver. Die Nebenserver können nur Lokale Daten empfangen, welche vom Mainserver geschickt werden. Der Mainserver empfängt Daten von außerhalb ordnet sie leicht (er Ordnet der Funktion einen Nebenserver zu) schickt dann das Parameter an den Nebenserver und dort wird dann der Befehl ausgeführt... So in der Theorie zumindest... xD

    mein Problem ist ich kann nachweisen dass der Mainserver mit dem Shutdownserver verbunden ist(sonst kommt schon oben beim Hochfahren der Server eine Fehlermeldung) aber bei folgendem Code kommt nichts am Wingserver an:

    [autoit]

    If $msg = -3 then Tcpsend($Shutdownserver,"all")

    [/autoit]


    Wenn man beim Wing/Shutdown Server das Parameter($recv) manuel in den Code...

    [autoit]

    $recv="all"

    [/autoit]


    Wird

    [autoit]

    If $recv="all" Then
    ProcessClose("Server.exe")
    Exit
    EndIf

    [/autoit]


    ausgeführt..
    Habs mal bisschen länger geschrieben..

  • Hi!

    Dein Code ist nicht gerade aufgeräumt!
    Benutz doch mal die Funktion "Tidy AutoIT Source" unter Tools im SciTe!?

    Dein Hauptprogramm habe ich zum Testen etwa umgeschrieben.
    Habe ein paar Sachen weggelassen und etwas dazugefühgt damit man die GUI schließen kann.
    Dieses solltest du dir ohnehin noch etwas genauer ansehen und etwas umbauen.
    Mir war es zuviel Aufwand.

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include<date.au3>
    TCPStartup()
    $gui = GUICreate("Server is loading...", 200, 100)
    $komischeskeineahnungwas = GUICtrlCreateProgress(1, 1, 199, 49)
    $Label = GUICtrlCreateLabel("Loading Includes...", 1, 50)
    GUISetState()
    $xx = 0
    $Timerdifftyp = 1
    $datafurset = "Loading Includes..."
    While 1
    GUICtrlSetData($komischeskeineahnungwas, $xx)
    GUICtrlSetData($Label, $datafurset)
    If GUIGetMsg() = -3 Then Exit
    If $xx = 0 Then
    ;~ #include<inc_consends.au3>
    $datafurset = "Startup intern Servers..."
    EndIf
    If $xx = 10 Then
    $Funcsocket = TCPListen("127.0.0.1", 00001)
    $Paramsocket = TCPListen("127.0.0.1", 00002)
    $PWsocket = TCPListen("127.0.0.1", 00003)
    $datafurset = "Start Accept for the Servers..."
    EndIf
    If $xx = 20 Then
    $acc = TCPAccept($Funcsocket)
    $Paramsocke = TCPAccept($Paramsocket)
    $PWSocke = TCPAccept($PWsocket)
    $datafurset = "Run Other Server..."
    EndIf
    If $xx = 30 Then
    Run("Shutdown-Server.exe")
    $datafurset = "Connect To Other Servers..."
    EndIf
    If $xx = 40 Then
    $Shutdownserver = TCPConnect("127.0.0.1", 26537)
    If $Shutdownserver = -1 Then
    MsgBox(0, "Can´t Connect to Shutdown Server", "")
    Exit
    EndIf

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

    $datafurset = "Load..."
    EndIf
    If $xx = 100 Then
    GUIDelete($gui)
    ExitLoop
    EndIf
    $xx = $xx + 10
    WEnd
    $Gui2 = GUICreate("Log", 300, 200)
    $Funcinput = GUICtrlCreateInput("Enter your Function", 1, 1, 149, 49)
    $Paraminput = GUICtrlCreateInput("Param", 1, 50, 149, 49)
    $Buttom_normal = GUICtrlCreateButton("Run normal Command", 150, 1, 149, 49)
    $Buttom_spezial = GUICtrlCreateButton("Run spezial Command", 150, 50, 149, 49)
    $edit_log = GUICtrlCreateEdit("", 1, 100, 299, 99)
    GUISetState()
    While 1
    $Timer1 = TimerInit()
    $Msg = GUIGetMsg($Gui2)
    Select
    Case $msg = $GUI_EVENT_CLOSE
    TCPShutdown()
    Exit

    Case $Msg = $Buttom_normal
    $Func = GUICtrlRead($Funcinput)
    TCPSend($Shutdownserver, $Func)
    If @error Then
    MsgBox(0,"","Commando nicht gesendet")
    Else
    MsgBox(0,"","Commando gesendet")
    EndIf

    Case $Msg = $Buttom_spezial
    $Func_spezial = GUICtrlRead($Funcinput)
    $Param_spezial = GUICtrlRead($Paraminput)
    TCPSend($Shutdownserver, $Func_spezial & " " & $Param_spezial)
    If @error Then
    MsgBox(0,"","Commando nicht gesendet")
    Else
    MsgBox(0,"","Commando gesendet")
    EndIf
    EndSelect
    WEnd

    [/autoit]

    Jetzt zum "Shutdown Server":

    Spoiler anzeigen
    [autoit]

    TCPStartup()
    $LShutServer = TCPListen("127.0.0.1", 26537) ;Listen sagt das englische Wort schon er horcht auf Port 26537
    While 1
    Do ; Mach das solange bis eine Verbindung hergestellt ist
    $Accept = TCPAccept($LShutServer) ;Ermöglicht/Lässt einen eingehenden Verbindungsversuch auf einem "Socket" zu.
    Until $Accept <> -1 ; -1 wird zurück gegeben solange keine Verbindung hergestellt wurde
    While 1 ; So Vebindung ist da jetzt kann was empfangen werden.
    $recv = TCPRecv($Accept, 2046)
    If @error Then ExitLoop ; Wenn jetzt dein Hauptprogramm geschlossen wird, wird bei TCPRecv ein Fehler auftretten.
    ; Dann wird die Schleife beendet und das Script wartet wieder bis eine neue Verbindung hergestellt wird.
    If $recv = "-h" Then Shutdown(1)
    If $recv = "all" Then
    MsgBox(0,"","Commando empfangen")
    ;~ ProcessClose("Server.exe")
    ;~ TCPShutdown()
    ;~ Exit
    EndIf
    WEnd
    TCPCloseSocket($Accept); Schließt den Socket damit eine neue Verbindung angenommen wird.
    $Accept = -1 ; da die Variable von vorhin als der Client (dein Haupt Server) verbunden war auf den socket identifier (Die Nummer der Verbindung) gesetzt wurde
    ; stellen wir sie auf -1 damit unsere Do Until Schleife wieder gereift und wartet bis eine Verbindung aufgebaut wird
    WEnd

    [/autoit]

    Ich habe Kommentare im Code hinterlassen.

    LG
    Concara

    If not :?: then ?( else :thumbup:

  • Dank dem Shutdownserverbeispiel weis ich (glaube ich) entlich wo auch der Fehler bei meinen anderen Servern lagg...