Suche nach Möglichkeiten mit TCP im LAN

  • Hallo zusammen

    Ich möchte am Wochenende mit einem neuen Skript beginnen. Es soll über mein LAN mit mehreren Rechnern im Büro kommunizieren können.
    Ich habe bereits gesehen, das es TCP-Befehle gibt, bin da allerdings noch nicht recht schlau draus geworden.

    Die Aufgaben für mein Skript sollen in etwa sein:
    - Meldung an den Server, sobald Client gestartet wurde,
    - Meldung an den Server, sobald auf dem Client bestimmte Kriterien erfüllt sind (Programme geöffnet, Programme geschlossen, Fehlermeldungen etc.)
    - Ferngesteuert vom Server Programme auf den Clients bedienen (manipulieren)
    - Ferngesteuert vom Server die Clients herunterfahren

    Auf dem Server - PC werde ich auf jedenfall ein GUI erstellen, wo ich die nötigen Operationen steuern kann. Der Client sollte im Prinzip einfach erkennen, wenn auf dem Server im GUI ein Button gedrückt wird, und dann eine definierte Aufgabe / Funktion ausführen, und den Vollzug zurückmelden, Damit im GUI auf dem Server ein Label oder so angezeigt werden kann.

    Das mit dem GUI traue ich mir zu, da habe ich schon viel herumexperimentiert. Allerdings blicke ich wie gesagt bein den TCP-Befehlen noch nicht richtig durch.

    Deshalb meine Frage an euch:
    Könnt Ihr mir ein Tutorial oder ein Beispiel zeigen, für Skripte, welche über das lokale Netzwerk komunizieren?

    Herzlichen Dank im Voraus!

    Liebe Grüsse
    Roman

  • Hi,
    ich hatte HIER mal eine Art Anleitung gepostet, wenn du damit nicht klarkommst, einfach melden :D
    Die Server bzw Client-Scripte aus der Hilfe sind eigentlich selbsterklärend...

  • Zu TCP gibt es ein Haufen Anleitungen, sogar Videos. Schau dir einfach mal die zwei Videos an, danach solltest du es zumindest so in etwa verstanden haben:
    http://www.youtube.com/watch?v=xYG68Sy9S0E
    http://www.youtube.com/watch?v=HLpdlsPVZFw

  • Ich hab auch noch zwei Scripte. Aber da gehts nur ums connecten und diconnecten. Nicht das dich zu viel Code bombardiert.

    Server:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiEdit.au3>
    #include <Array.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $iListen = 0
    Global $iCountClient = 0
    Global $sData, $iIndex, $iAccept
    Global $iMaxClients = 5
    Global $aClient[$iMaxClients]

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

    GUICreate("Multi-Server", 400, 600, 50, 50, -1, $WS_EX_TOPMOST)
    $cMemo = GUICtrlCreateEdit("", 10, 10, 380, 580, BitOR($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    GUISetState()

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    HotKeySet("{ESC}", "_Exit")

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

    TCPStartup()

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

    $iListen = TCPListen("127.0.0.1", 8080)
    If $iListen = -1 Then _Exit()

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

    While 1
    $iAccept = TCPAccept($iListen)
    If $iAccept >= 0 Then
    If $iCountClient < $iMaxClients Then
    $aClient[$iCountClient] = $iAccept
    _GUICtrlEdit_AppendText($cMemo, "New client connected - ID: " & $aClient[$iCountClient] & @CRLF)
    TCPSend($aClient[$iCountClient], String($aClient[$iCountClient]))
    $iCountClient += 1
    Else
    TCPSend($iAccept, "Full")
    TCPCloseSocket($iAccept)
    EndIf
    EndIf

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

    If $iCountClient > 0 Then
    For $i = 0 To $iCountClient - 1
    $sData = TCPRecv($aClient[$i], 1024)
    If @error And $aClient[$i] > 0 Then
    _GUICtrlEdit_AppendText($cMemo, $aClient[$i] & " Disconnected" & @CRLF)
    $aClient[$i] = 0
    EndIf
    Next
    $iIndex = 0
    Do
    If $aClient[$iIndex] > 0 Then
    $iIndex += 1
    Else
    TCPCloseSocket($aClient[$iIndex])
    _ArrayDelete($aClient, $iIndex)
    _ArrayAdd($aClient, "")
    $iCountClient -= 1
    If $iIndex > 0 Then $iIndex -= 1
    EndIf
    Until $iIndex = $iCountClient
    EndIf
    WEnd

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

    Func _Exit()
    If $iCountClient > 0 Then
    For $i = 0 To $iCountClient - 1
    TCPCloseSocket($aClient[$i])
    Next
    EndIf
    TCPCloseSocket($iListen)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]

    Client:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $iConnect, $sData, $hGui

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

    $hGui = GUICreate("Client", 200, 100)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    HotKeySet("{ESC}", "_Exit")

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

    TCPStartup()

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

    $iConnect = TCPConnect("127.0.0.1", 8080)
    If $iConnect = -1 Then
    MsgBox(16, "Fehler", "Konnte nicht verbinden.")
    _Exit()
    EndIf

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

    GUISetState()

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

    While 1
    $sData = TCPRecv($iConnect, 1024)
    If $sData <> "" Then
    ConsoleWrite($sData & @CRLF)
    If $sData = "Full" Then
    MsgBox(16, "Fehler", "Server akzeptiert keine Verbindungen mehr.")
    _Exit()
    Else
    WinSetTitle($hGui, "", "Client " & $sData)
    AdlibRegister("_KeepAlive", 500)
    EndIf
    EndIf
    WEnd

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

    Func _KeepAlive()
    TCPSend($iConnect, "Alive")
    If @error Then
    MsgBox(16, WinGetTitle($hGui) & " - Fehler", "Senden fehlgeschlagen.")
    _Exit()
    EndIf
    EndFunc

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

    Func _Exit()
    AdlibUnRegister()
    TCPCloseSocket($iConnect)
    TCPShutdown()
    Exit
    EndFunc

    [/autoit]

    Den Client einfach zur Exe kompilieren und dann kannst du ihn mehrmals starten.

    Willst du auch den Bildschirm der Clients sehen?

  • Hey Leute!

    Vielen Dank für eure Antworten, und Beispiele!
    Ich bin gerade auf dem Sprung, und kann daher noch nicht alles gerade lesen und verstehen ;-D
    Aber Danke auf jedenfall schonmal.

    Und @m-obi: Nein, das habe ich nicht vorgesehen. Falls ich das brauchen würde, würde ich wohl eine VNC-Verbindung verwenden. Da habe ich auch schon was eingerichtet, aber die ist eigentlich nur gedacht, wenn alles andere nicht funktioniert.

    Liebe Grüsse
    Roman