Hi Leute,
hier mal ein Beispiel, wie man einen einfachen IP-Scanner realisieren könnte. (Konsolenanwendung)
Angucken und lernen, bitte kein C&P. ;D
Wenn ich euch viel geholfen habe, könnt Ihr mich ja in einem Programm erwähnen oder Ähnliches. Der Code ist jedenfalls frei verfügbar und liegt unter der WTFPL. Mit anderen (deutschen) Worten: Macht damit, was Ihr wollt.
Er ist verbesserungswürdig, läuft aber einigermaßen gut.
Hier der Code (OOP, benutzt VB2010-Compiler (z.B. bei den inline Properties)):
Spoiler anzeigen
Für Fragen zu dem Code bin ich gerne offen. Diese können wie gewohnt hier gestellt werden. ;)
Habt Spaß,
nikeee
hier mal ein Beispiel, wie man einen einfachen IP-Scanner realisieren könnte. (Konsolenanwendung)
Angucken und lernen, bitte kein C&P. ;D
Wenn ich euch viel geholfen habe, könnt Ihr mich ja in einem Programm erwähnen oder Ähnliches. Der Code ist jedenfalls frei verfügbar und liegt unter der WTFPL. Mit anderen (deutschen) Worten: Macht damit, was Ihr wollt.
Er ist verbesserungswürdig, läuft aber einigermaßen gut.
Hier der Code (OOP, benutzt VB2010-Compiler (z.B. bei den inline Properties)):
VB.NET-Quellcode
- Option Strict On
- Module SimpleScanner
- Dim WithEvents __Scanner As NetworkScanner
- Dim __IPs As List(Of NetworkScanner.PingResult)
- Sub Main()
- Dim abc As String = "192.168.1"
- Console.Title = "Simpler IPScanner"
- Console.WriteLine("Simpler IP-Scanner.")
- Console.WriteLine()
- Dim args As String() = Environment.GetCommandLineArgs()
- If args.Length > 1 Then
- Dim abc_ As String = FilterMask(args(1))
- If abc_ <> "-1" Then
- abc = abc_
- Console.WriteLine("Benutze Adressbereich aus Kommandozeile: {0}", abc)
- Else
- Console.WriteLine("Der Adressbereich der Kommandozeilenargumente konnte nicht validiert werden.")
- Console.WriteLine("Benutze standard Adressbereich: {0}", abc)
- End If
- Else
- Console.WriteLine()
- Console.WriteLine("Bitte geben Sie die ersten drei Teile der IP-Adresse an. (z.B. 192.168.178)")
- Dim input As String = Console.ReadLine().Trim
- If input = String.Empty Then
- Console.WriteLine("Keine Eingabe entdeckt.")
- Console.WriteLine("Benutze standard Adressbereich: {0}", abc)
- Else
- Dim abc_ As String = FilterMask(input)
- If abc_ <> "-1" Then
- abc = abc_
- Console.WriteLine("Benutze eingegebenen Adressbereich: {0}", abc)
- Else
- Console.WriteLine("Der Adressbereich konnte nicht validiert werden.")
- Console.WriteLine("Benutze standard Adressbereich: {0}", abc)
- End If
- End If
- End If
- Console.WriteLine()
- Console.WriteLine(" Folgende IPs sind erreichbar:")
- Console.WriteLine()
- Console.WriteLine(" ### AAA.BBB.CCC.DDD - Hostname - Pingzeit")
- __Scanner = New NetworkScanner(abc)
- __Scanner.Scan()
- While __Scanner.IsScanning : End While
- Dim s As String = Console.ReadLine()
- s = s.Trim
- If IsNumeric(s) Then
- Dim nummer As Integer = Integer.Parse(s)
- Dim ip_arr As NetworkScanner.PingResult() = __IPs.ToArray
- If nummer <= ip_arr.Length - 1 Then
- My.Computer.Clipboard.SetText(ip_arr(nummer).IP)
- Console.WriteLine("Die IP-Adresse ""{0}"" wurde in Ihre Zwischenablage kopiert.", ip_arr(nummer))
- End If
- ElseIf s = "a" Then
- Dim Result_arr As NetworkScanner.PingResult() = __IPs.ToArray
- Dim IP_Only_arr(__IPs.Count - 1) As String
- Dim zaehler As Integer = 0
- For Each result As NetworkScanner.PingResult In __IPs
- IP_Only_arr(zaehler) = result.IP
- zaehler += 1
- Next
- Dim clip As String = Join(IP_Only_arr, Environment.NewLine)
- My.Computer.Clipboard.SetText(clip)
- Console.WriteLine("Die IP-Adressen wurden in Ihre Zwischenablage kopiert.")
- End If
- End Sub
- Friend Function FilterMask(ByVal input As String) As String
- Dim pt As String = "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
- Dim m As System.Text.RegularExpressions.Match = System.Text.RegularExpressions.Regex.Match(input, pt)
- If m.Captures.Count <> 1 Then
- Return "-1"
- Else
- Return m.Value
- End If
- End Function
- Private Sub __Scanner_ScanComplete(ByVal AvailabeIPs As System.Collections.Generic.List(Of NetworkScanner.PingResult)) Handles __Scanner.ScanComplete
- __IPs = AvailabeIPs
- Dim _Counter As Integer = 0
- For Each PingResult As NetworkScanner.PingResult In __IPs
- Console.WriteLine(" {0,-3} {1,-15} - {2,-20} - {3}ms", _Counter, PingResult.IP, PingResult.Hostname, PingResult.ElapsedTime)
- _Counter += 1
- Next
- Console.WriteLine()
- Console.WriteLine()
- Console.WriteLine("Scannen fertig.")
- Console.WriteLine()
- If _Counter > 0 Then
- Console.WriteLine("'a' zum Kopieren aller IPs.")
- Console.WriteLine("Eine Nummer, um eine bestimmte zu kopieren")
- Else
- Console.WriteLine("Es wurden keine IPs gefunden.") 'Unwahrscheinlich, da normalerweise mindestens der Localhost im Netz ist ^^
- 'Man kann aber nie wissen.
- End If
- End Sub
- End Module
- Friend Class NetworkScanner
- protected __MaxThreads as Integer = 20
- protected __CurrentThreads As Integer = 0
- Public Property MaxThreads() As Integer
- get
- return __MaxThreads
- end get
- set (value as integer)
- __MaxThreads = value
- end set
- end property
- Public Property CurrentThreads() As Integer
- get
- return __CurrentThreads
- end get
- set (value as integer)
- __CurrentThreads= value
- end set
- end property
- Protected __Subnet As String
- Protected __IPList As New List(Of PingResult)
- Protected __ResultCounter As Integer
- Public ReadOnly Property IPList As List(Of PingResult)
- Get
- Return __IPList
- End Get
- End Property
- Public ReadOnly Property Subnet As String
- Get
- Return __Subnet
- End Get
- End Property
- Public ReadOnly Property IsScanning As Boolean
- Get
- Return __ResultCounter < 255
- End Get
- End Property
- Public Event ScanComplete(ByVal AvailabeIPs As List(Of PingResult))
- Public Sub New(ByVal Subnet As String)
- __Subnet = Subnet
- End Sub
- Public Sub Scan()
- For d As Integer = 0 To 255 Step 1
- Dim ping As New IPPinger(Me, String.Format("{0}.{1}", __Subnet, d))
- AddHandler ping.GotPingResult, AddressOf GotPingResult
- ping.StartPing()
- Next
- End Sub
- Private Sub GotPingResult(ByVal sender As NetworkScanner, ByVal e As PingResult)
- If e.Successful Then
- 'Man könnte auch die nicht erfolgreichen adden, mache ich hier aber nicht, weil wir nur die erfolgreichen haben wollen ;)
- __IPList.Add(e)
- End If
- __ResultCounter += 1
- If __ResultCounter > 255 Then
- RaiseEvent ScanComplete(__IPList)
- End If
- End Sub
- Friend Structure PingResult
- Dim IP As String
- Dim Successful As Boolean
- Dim ElapsedTime As Long
- Dim Hostname As String
- Dim TimeOut As Integer
- Friend Sub New(ByVal _IP As String, ByVal _Successful As Boolean, ByVal _ElapsedTime As Long, ByVal _Hostname As String, ByVal _TimeOut As Integer)
- IP = _IP
- Successful = _Successful
- ElapsedTime = _ElapsedTime
- Hostname = _Hostname
- TimeOut = _TimeOut
- End Sub
- End Structure
- End Class
- Friend Class IPPinger
- Protected __IP As String
- Protected __Scanner As NetworkScanner
- Protected __TimeOut As Integer
- Public Shared ReadOnly Property StandardTimeOut As Integer
- Get
- Return 1000
- End Get
- End Property
- Public ReadOnly Property IP As String
- Get
- Return __IP
- End Get
- End Property
- Public Event GotPingResult(ByVal sender As NetworkScanner, ByVal e As NetworkScanner.PingResult)
- Public Sub New(ByVal _Scanner As NetworkScanner, ByVal _IP As String)
- __Scanner = _Scanner
- __IP = _IP
- __TimeOut = 1000
- End Sub
- Public Sub New(ByVal _Scanner As NetworkScanner, ByVal _IP As String, ByVal _TimeOut As Integer)
- __Scanner = _Scanner
- __IP = _IP
- __TimeOut = _TimeOut
- End Sub
- Public Sub StartPing()
- While __Scanner.CurrentThreads >= __Scanner.MaxThreads : End While
- Dim t As New Threading.Thread(AddressOf _ping_ip_thread)
- t.Name = __IP & " - Pingthread"
- t.Start(__IP)
- End Sub
- Private Sub _ping_ip_thread(ByVal _IP As Object)
- __Scanner.CurrentThreads += 1
- Try
- Dim Milliseconds As Long = Me.DoPing(_IP.ToString)
- Dim result As NetworkScanner.PingResult
- If Milliseconds <> -1 Then
- Dim HostName As String = Net.Dns.GetHostEntry(_IP.ToString).HostName
- result = New NetworkScanner.PingResult(_IP.ToString, True, Milliseconds, HostName, __TimeOut)
- Else
- result = New NetworkScanner.PingResult(_IP.ToString, False, Milliseconds, String.Empty, __TimeOut)
- End If
- RaiseEvent GotPingResult(__Scanner, result)
- Catch ex As Exception
- Throw ex 'Ja, sinnlos, ich weiß. Man könnte auch einen "Nicht-erreichbar"-Pin zurückgeben.
- Finally
- __Scanner.CurrentThreads -= 1
- End Try
- End Sub
- Private Function DoPing(ByVal _IP As String) As Long
- Dim ping As New Net.NetworkInformation.Ping
- Dim reply As Net.NetworkInformation.PingReply = ping.Send(_IP, __TimeOut)
- If reply.Status = Net.NetworkInformation.IPStatus.Success Then
- Return reply.RoundtripTime
- Else
- Return -1
- End If
- End Function
- End Class
Für Fragen zu dem Code bin ich gerne offen. Diese können wie gewohnt hier gestellt werden. ;)
Habt Spaß,
nikeee
Von meinem iPhone gesendet
Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von „nikeee13“ ()