Arbeiten mit PING

  • Guten Morgen,

    ich grübel und grübel, aber komme nicht wirklich weiter...
    Kurz mein Vorhaben:

    Ich schicke täglich über TCP StartUp eine Nachricht an verschiedene Benutzer, sodass diese darauf Aufmerksam gemacht werden, ein bestimmtes Programm zu beenden.
    Läuft auch einwandfrei! Hier kurz der Quelltext als Test, bevor das "Programm" online geht mit 30 anderen IP-Adressen:

    Spoiler anzeigen
    [autoit]


    Global $aIpAdressen[3]
    $aIpAdressen[0] = "172.21.122.2"
    $aIpAdressen[1] = "172.21.122.3"
    $aIpAdressen[2] = "172.21.122.4"

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

    GUICreate("Empfängerliste")
    Global $aLabels[3]
    $aLabels[0] = GUICtrlCreateLabel("Name1, Vorname1", 100, 10)
    $aLabels[0] = GUICtrlCreateLabel($aIpAdressen[0], 10, 10)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[1] = GUICtrlCreateLabel("Name2, Vorname2", 100, 30)
    $aLabels[1] = GUICtrlCreateLabel($aIpAdressen[1], 10, 30)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[2] = GUICtrlCreateLabel("Name3, Vorname3", 100, 50)
    $aLabels[2] = GUICtrlCreateLabel($aIpAdressen[2], 10, 50)
    GUICtrlSetColor(-1, 0x0000FF)
    GUISetState()

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

    Senden()

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

    While 1
    Sleep(10)
    If GUIGetMsg() = -3 Then Exit
    WEnd

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

    Func Senden()
    Local $iIndex, $iSocket, $iSendedBytes
    TCPStartup()
    For $iIndex = 0 To Ubound($aIpAdressen)-1
    $iSocket = TCPConnect($aIpAdressen[$iIndex], 4321)

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

    If @error Then
    GUICtrlSetColor($aLabels[$iIndex], 0xFF0000)

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

    Else
    $iSendedBytes = TCPSend($iSocket, "NACHRICHT!")
    TCPCloseSocket($iSocket)
    GUICtrlSetColor($aLabels[$iIndex], 0x00FF00)
    EndIf
    Next

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

    TCPShutdown()
    EndFunc

    [/autoit]

    Nun kann es aber vorkommen, dass Mitarbeiter im Urlaub sind, der Rechner somit aus ist. Wenn ich das Skript laufen lasse, dann rödelt er bei IP-Adressen und springt erst nach einer bestimmten Zeitspanne weiter. Ist blöd! Ich muss so schnell wie es nur geht die Nachricht an die Empfänger raus schicken, ohne das er lange nach einer IP sucht und dann nicht findet.
    Wie würdet ihr das am besten lösen?

    Ich dachte an eine IF-Schleife, sowie das über den ping-Befehl zu lösen :rolleyes:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $aIpAdressen[3]
    $aIpAdressen[0] = "172.21.122.2"
    $aIpAdressen[1] = "172.21.122.3"
    $aIpAdressen[2] = "172.21.122.4"

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

    GUICreate("Empfängerliste")
    Global $aLabels[3]

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

    $aLabels[0] = GUICtrlCreateLabel("Name1, Vorname1", 100, 10)
    $aLabels[0] = GUICtrlCreateLabel($aIpAdressen[0], 10, 10)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[1] = GUICtrlCreateLabel("Name2, Vorname2", 100, 30)
    $aLabels[1] = GUICtrlCreateLabel($aIpAdressen[1], 10, 30)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[2] = GUICtrlCreateLabel("Name3, Vorname3", 100, 50)
    $aLabels[2] = GUICtrlCreateLabel($aIpAdressen[2], 10, 50)
    GUICtrlSetColor(-1, 0x0000FF)
    GUISetState()

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

    $ping[0] = Ping($aIpAdresse[0])
    If $ping > 0 Then

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

    Senden()

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

    While 1
    Sleep(10)
    If GUIGetMsg() = -3 Then Exit
    WEnd

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

    Func Senden()
    Local $iIndex, $iSocket, $iSendedBytes
    TCPStartup()
    For $iIndex = 0 To Ubound($aIpAdressen)-1
    $iSocket = TCPConnect($aIpAdressen[$iIndex], 4321)

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

    If @error Then
    GUICtrlSetColor($aLabels[$iIndex], 0xFF0000)

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

    Else
    $iSendedBytes = TCPSend($iSocket, "das hier ist die Nachricht")
    TCPCloseSocket($iSocket)
    GUICtrlSetColor($aLabels[$iIndex], 0x00FF00)
    EndIf
    Next

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

    TCPShutdown()
    EndFunc

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

    EndIf

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

    $ping[1] = Ping($aIpAdresse[1])
    ...
    ...
    ...

    [/autoit]

    Aber das funktioniert nicht so wie ich es mir vorstelle, vorallem wenn ich 30 IP-Adressen mit diesem Rattenschwanz in ein Skript schreibe...
    Bin ich ja bei geschätzen 300 Zeilen für eine einfache Nachricht... Aber das wäre noch nicht mal tragisch ;)

    Einmal editiert, zuletzt von Nighty (30. Juli 2010 um 07:07)

  • lass die clienten doch einfach alle 30 min ihre ip senden.
    dann weißt du genau wer in den letzten 30 minuten online war.

    dann sagste dem server, er soll die empfangenen ips speichern und in ner for schleife abarbeiten.
    somit hättest du das problem nicht. du sendest nur an die, die sich wirklich gemeldet haben.

    So far

    Kev

  • Hallo Nighty,

    schau mal in meiner Sig den IP-Pinger an.
    Vielleicht kannst Du Dir ja daraus etwas zusammenbasteln ;)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Ich bräuchte mal eine Inspiration :S

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $aIpAdressen[3]
    $aIpAdressen[0] = "172.21.122.2"
    $aIpAdressen[1] = "172.21.122.3"
    $aIpAdressen[2] = "172.21.122.23"

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

    GUICreate("Empfängerliste")
    Global $aLabels[3]

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

    $aLabels[0] = GUICtrlCreateLabel("Name1, Vorname1", 100, 10)
    $aLabels[0] = GUICtrlCreateLabel($aIpAdressen[0], 10, 10)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[1] = GUICtrlCreateLabel("Name2, Vorname2", 100, 30)
    $aLabels[1] = GUICtrlCreateLabel($aIpAdressen[1], 10, 30)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[2] = GUICtrlCreateLabel("Name3, Vorname3", 100, 50)
    $aLabels[2] = GUICtrlCreateLabel($aIpAdressen[2], 10, 50)
    GUICtrlSetColor(-1, 0x0000FF)
    GUISetState()

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

    Senden()
    _ping()

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

    Func _ping()
    Local $ping[3]
    $ping[0] = "172.21.122.2"
    $ping[1] = "172.21.122.3"
    $ping[2] = "172.21.122.23"

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

    For $i = 0 To UBound($ping)-1
    $result = Ping($ping[$i])

    If $result > 0 Then
    $result = 1

    Else
    $result = 0

    EndIf
    Next
    EndFunc

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

    ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< [Platzhalter]

    Func Senden()
    Local $iIndex, $iSocket, $iSendedBytes, $result
    TCPStartup()

    For $iIndex = 0 To Ubound($aIpAdressen)-1
    $iSocket = TCPConnect($aIpAdressen[$iIndex], 4321)

    If @error Or $result = 1 Then
    GUICtrlSetColor($aLabels[$iIndex], 0xFF0000)

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

    Else
    $iSendedBytes = TCPSend($iSocket, "das hier ist die Nachricht")
    TCPCloseSocket($iSocket)
    GUICtrlSetColor($aLabels[$iIndex], 0x00FF00)
    EndIf
    Next

    TCPShutdown()
    EndFunc

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

    [Platzhalter] =

    Wie ist es mir möglich, die Nachfolgende Funktion so in eine Schleife zu packen, dass ich diese Funktion nur ausführe, wenn der Rechner anpingbar ist?
    Ansonsten soll er mir die IP rot markieren. Ganz schön tricky :>

  • Spoiler anzeigen
    [autoit]

    Global $aIpAdressen[3]
    $aIpAdressen[0] = "172.21.122.2"
    $aIpAdressen[1] = "172.21.122.3"
    $aIpAdressen[2] = "172.21.122.23"

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

    GUICreate("Empfängerliste")
    Global $aLabels[3]

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

    $aLabels[0] = GUICtrlCreateLabel("Name1, Vorname1", 100, 10)
    $aLabels[0] = GUICtrlCreateLabel($aIpAdressen[0], 10, 10)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[1] = GUICtrlCreateLabel("Name2, Vorname2", 100, 30)
    $aLabels[1] = GUICtrlCreateLabel($aIpAdressen[1], 10, 30)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[2] = GUICtrlCreateLabel("Name3, Vorname3", 100, 50)
    $aLabels[2] = GUICtrlCreateLabel($aIpAdressen[2], 10, 50)
    GUICtrlSetColor(-1, 0x0000FF)
    GUISetState()

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

    Senden()
    _ping()

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

    Func _ping()
    Local $ping[3]
    $ping[0] = "172.21.122.2"
    $ping[1] = "172.21.122.3"
    $ping[2] = "172.21.122.23"

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

    For $i = 0 To UBound($ping)-1
    $result = Ping($ping[$i])

    If $result > 0 Then
    $result = 1

    Else
    $result = 0

    EndIf
    Next
    EndFunc

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

    ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< [Platzhalter]

    Func Senden()
    Local $iIndex, $iSocket, $iSendedBytes, $result
    TCPStartup()

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

    For $iIndex = 0 To Ubound($aIpAdressen)-1
    If Ping ($aIpAdressen[$iIndex]) Then
    $iSocket = TCPConnect($aIpAdressen[$iIndex], 4321)

    If @error Or $result = 1 Then
    GUICtrlSetColor($aLabels[$iIndex], 0xFF0000)

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

    Else
    $iSendedBytes = TCPSend($iSocket, "das hier ist die Nachricht")
    TCPCloseSocket($iSocket)
    GUICtrlSetColor($aLabels[$iIndex], 0x00FF00)
    EndIf
    EndIf
    Next

    TCPShutdown()
    EndFunc

    [/autoit]

    mfg. Jam00

  • Könnte man das ganz problem nicht auch so lösen?

    Spoiler anzeigen
    [autoit]

    Global $aIpAdressen[3]
    $aIpAdressen[0] = "172.21.122.2"
    $aIpAdressen[1] = "172.21.122.3"
    $aIpAdressen[2] = "172.21.122.4"

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

    GUICreate("Empfängerliste")
    Global $aLabels[3]
    $aLabels[0] = GUICtrlCreateLabel("Name1, Vorname1", 100, 10)
    $aLabels[0] = GUICtrlCreateLabel($aIpAdressen[0], 10, 10)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[1] = GUICtrlCreateLabel("Name2, Vorname2", 100, 30)
    $aLabels[1] = GUICtrlCreateLabel($aIpAdressen[1], 10, 30)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[2] = GUICtrlCreateLabel("Name3, Vorname3", 100, 50)
    $aLabels[2] = GUICtrlCreateLabel($aIpAdressen[2], 10, 50)
    GUICtrlSetColor(-1, 0x0000FF)
    GUISetState()

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

    Senden()

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

    While 1
    Sleep(10)
    If GUIGetMsg() = -3 Then Exit
    WEnd

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

    Func Senden()
    Local $iIndex, $iSocket, $iSendedBytes
    if Ping($aIpAdressen[$iIndex], 125)= 0 then Return; Wenn Computer nicht erreichbar dann verlässt er die funktion ohne zu senden
    TCPStartup()
    For $iIndex = 0 To Ubound($aIpAdressen)-1
    $iSocket = TCPConnect($aIpAdressen[$iIndex], 4321)

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

    If @error Then
    GUICtrlSetColor($aLabels[$iIndex], 0xFF0000)

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

    Else
    $iSendedBytes = TCPSend($iSocket, "NACHRICHT!")
    TCPCloseSocket($iSocket)
    GUICtrlSetColor($aLabels[$iIndex], 0x00FF00)
    EndIf
    Next

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

    TCPShutdown()
    EndFunc

    [/autoit]

    €dit: Lösung war doch nich so sinnvoll -.- Sorry

    €dit2:
    Hab das mal ein bisschen umgeschrieben :) Jetzt sollte das auch Funktionieren.

    Umgeändert
    [autoit]

    Global $aIpAdressen[3]
    $aIpAdressen[0] = "172.21.122.2"
    $aIpAdressen[1] = "172.21.122.3"
    $aIpAdressen[2] = "172.21.122.4"

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

    GUICreate("Empfängerliste")
    Global $aLabels[3]
    $aLabels[0] = GUICtrlCreateLabel("Name1, Vorname1", 100, 10)
    $aLabels[0] = GUICtrlCreateLabel($aIpAdressen[0], 10, 10)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[1] = GUICtrlCreateLabel("Name2, Vorname2", 100, 30)
    $aLabels[1] = GUICtrlCreateLabel($aIpAdressen[1], 10, 30)
    GUICtrlSetColor(-1, 0x0000FF)

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

    $aLabels[2] = GUICtrlCreateLabel("Name3, Vorname3", 100, 50)
    $aLabels[2] = GUICtrlCreateLabel($aIpAdressen[2], 10, 50)
    GUICtrlSetColor(-1, 0x0000FF)
    GUISetState()

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

    Senden()

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

    While 1
    Sleep(10)
    If GUIGetMsg() = -3 Then Exit
    WEnd

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

    Func Senden()
    Local $iIndex, $iSocket, $iSendedBytes

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

    For $iIndex = 0 To UBound($aIpAdressen) - 1
    If Ping($aIpAdressen[$iIndex], 50) = 0 Then ; Wenn Computer nicht erreichbar dann überspringt er den Computer
    GUICtrlSetColor($aLabels[$iIndex], 0xFF0000)

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

    Else
    TCPStartup()
    $iSocket = TCPConnect($aIpAdressen[$iIndex], 4321)
    $iSendedBytes = TCPSend($iSocket, "NACHRICHT!")
    TCPCloseSocket($iSocket)
    TCPShutdown()
    GUICtrlSetColor($aLabels[$iIndex], 0x00FF00)
    EndIf
    Next

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

    EndFunc ;==>Senden

    [/autoit]

    Mfg
    monkey

    Monkey - die finale Potenz von göttlich!
    Sloganizer

    2 Mal editiert, zuletzt von monkey (29. Juli 2010 um 14:13)

  • Das gefällt mir sehr gut! Danke Euch :rolleyes:

    Ich baue mir jetzt noch mit ein, dass ich zum einen sehe, ob Rechner XY online ist (Schrift grün/rot) - die Nachricht bekam (Schrift grün/rot) - den Namen.
    Aber das ist schon Top!

    Einmal editiert, zuletzt von Nighty (29. Juli 2010 um 14:44)

  • Hallo Nighty,

    das kannst du dann ja so machen:

    Spoiler anzeigen
    [autoit]

    Global $aIpAdressen[3]
    $aIpAdressen[0] = "172.21.122.2"
    $aIpAdressen[1] = "172.21.122.3"
    $aIpAdressen[2] = "172.21.122.23"

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

    GUICreate("Empfängerliste")
    Global $aNLabels[3],$aIPLabels[3]

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

    For $i = 0 To UBound($aIpAdressen) - 1
    $aNLabels[$i] = GUICtrlCreateLabel("Name1, Vorname1", 100, 10+$i*20)
    GUICtrlSetColor(-1, 0x0000FF)
    $aIPLabels[$i] = GUICtrlCreateLabel($aIpAdressen[$i], 10, 10+$i*20)
    GUICtrlSetColor(-1, 0x0000FF)
    Next
    GUISetState()

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

    _ping()

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

    while GUIGetMsg() <> -3

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

    WEnd

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

    Func _ping()
    #cs ;unnötig, da gleicher Inhalt wie $aIpAdressen
    Local $ping[3]
    $ping[0] = "172.21.122.2"
    $ping[1] = "172.21.122.3"
    $ping[2] = "172.21.122.23"
    #ce
    For $i = 0 To UBound($aIpAdressen) - 1
    $result = Ping($aIpAdressen[$i])

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

    If $result = 0 Then
    GUICtrlSetColor($aIPLabels[$i], 0xFF0000)
    Else
    GUICtrlSetColor($aIPLabels[$i], 0x00FF00)
    Senden($aIpAdressen[$i],$i)
    EndIf
    Next
    EndFunc ;==>_ping

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

    Func Senden($sIP, $iIndex)
    Local $iSocket, $iSendedBytes, $result
    TCPStartup()
    $iSocket = TCPConnect($sIP, 4321)

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

    If @error Or $result = 1 Then
    GUICtrlSetColor($aNLabels[$iIndex], 0xFF0000)

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

    Else
    $iSendedBytes = TCPSend($iSocket, "das hier ist die Nachricht")
    if $iSendedBytes <> 0 Then
    GUICtrlSetColor($aNLabels[$iIndex], 0x00FF00)
    Else
    GUICtrlSetColor($aNLabels[$iIndex], 0xFF000F)
    EndIf
    TCPCloseSocket($iSocket)
    EndIf

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

    TCPShutdown()
    EndFunc ;==>Senden

    [/autoit]

    mfg (Auto)Bert

  • Hmm, also dein Skript, lieber AutoBert, gefällt mir dann doch besser als mein eigenes :rolleyes:

    Danke vielmals für Eure Unterstützung!

    Jedoch müsste dein Skript etwas angepasst werden, denn ich habe jetzt überall den selben Namen (Vorname1, Name1).

    Einmal editiert, zuletzt von Nighty (30. Juli 2010 um 09:47)

  • Hallo Nighty,

    du musst nur Zeile 10 ändern zu:

    [autoit]

    $aNLabels[$i] = GUICtrlCreateLabel("Name" & $i+1 & "Vorname" & $i+1, 100, 10+$i*20)

    [/autoit]

    wobei ich davon ausgehe, dass du in deiner endgültigen Version die Daten aus einer INI oder TXT-Datei holst,

    mfg (Auto)Bert