IP-Range pingen, aber nur bestimmte Anzahl

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von AliveDevil.

    IP-Range pingen, aber nur bestimmte Anzahl

    Hallo,

    ich habe eine IP-Range die ich durchpingen will.
    Bis jetzt mache ich das so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ping(ByVal startIP As String, ByVal endIP As String)
    2. Dim IPStart As Integer = IPData.IP2Int(startIP)
    3. Dim IPEnd As Integer = IPData.IP2Int(endIP)
    4. pCounter = IPEnd - IPStart
    5. For i = IPStart To IPEnd
    6. Dim pingreq As Ping = New Ping()
    7. Dim sIP = IPData.Int2IP(i)
    8. AddHandler pingreq.PingCompleted, AddressOf PingResult
    9. pingreq.SendAsync(sIP, CInt(nTimeout.Value), sIP)
    10. Next
    11. End Sub


    Aber wie mache ich das das nur 10 Pings zur Zeit laufen, und wenn ein Ping durch ist dafür ein neuer gestartet wird?
    Habs mit - If laufendeThreads < nMaxThreads.Value Then - probiert, aber damit kam er nur bis 10!
    Angenommen ich will 1000 IPs Pingen, das macht die SUB oben auf einmal, also alle 1000 IPs Async pingen.
    Wenn mir das aber zuviel ist und ich nur 10 oder 15 IPs zur Zeit Pingen will und wenn dann z.B. ein PingCompletedEvent eingeht, dieses dann ein neuen Ping startet, wie mache ich das am besten?
    Irgend wie mit ner Liste arbeiten wo er sich die übrigen IPs2Ping dann abholt und dann die schon gepingten rauslöscht?!?
    Nimm einfach die Parallel-Klasse. Dort kannste alles einstellen wie viele Operationen gleichzeitig laufen sollen und du lasse das dann Sync laufen. Ist vll. nicht 100% optimal aber garantiert für den Aufwand mehr als akzeptabel.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Da ich es gerade für einen Test wieder ausgraben musste: Dataflow in der Task Parallel Library.
    Damit kannst du ebenfalls durch eine Option einstellen, wie viele IPs parallel verarbeitet werden sollen.
    Du hast also einen Producer, der dir die IP Adressen in einen Buffer haut. Von dort werden durch den Consumer die Einträge mit einer maximalen Parallelisierung abgearbeit.
    Einfach zu bauen, und sehr flexibel in der Handhabung.
    Genauer kannst du dir das in diesem Beispiel ansehen.