![]()
|
|
Visual Basic Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 |
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 |

Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von »nikeee13« (9. Oktober 2010, 17:32)
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nikeee13« (5. September 2010, 22:24)



FileSpy 1.2 - Herausfinden, wo Programme ihre Daten speichern! Zum Download Dann solltest du den Beitrag vielleicht noch ein paar mal durchlesenIch sehe in deinem Blog nicht ein warum Ich kein Modul verwenden sollte.
Ja, denn VB.NET ist eine Objektorientierte Sprache und sollte auch so genutzt werden, wenn du nicht nach OOP programmieren möchtest dann kannst du ja weiterhin VB6 nutzen.
Zitat
Wenn ich nicht nach OOP programmiere... ist das wirklich so schlimm?
Wenn du was dagegen hast, dass deine Module, weiter verwendet werden dann solltest du diese nicht im Sourcecode Austausch posten
Zitat
Und vielleicht hab ich auch was dagegen das meine Module weiterverwendet werden...
denn Namen wie "abc" helfen niemandem beim Verstehen.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »nikeee13« (27. September 2010, 19:00)
naja gut mach dir erst mal wegen deiner prüfung um den code keine waffel Mehr soll es auch nicht sein.Für einen simplen Massping vllt. kein schlechter Anfang, aber mehr auch nicht.
Soll ich es etwa als Classlibrary bereitstellen? Man kann sich ja auch die Klassen in eine Forms-Anwendung packen. Die Verwendung bleibt die gleiche.Du implementierst es fest in eine Konsolenanwendung.
Ein vernünftiger Scanner kann ebenso ein simpler Scanner sein. Du meinst wahrscheinlich einen umfangreicheren. Naja, ich wollte nur ein Beispiel geben, wie man es mit Multithreading machen könnte. Wer dann noch Sachen wie eine Subnetzmaske haben will, muss sich das selbst implementieren. Mir ging es hier um den Ansatz. (Deshalb auch den Ping aus dem My-Namespace)Ich bleibe dabei. Ein vernünftiger Netzwerkscanner ist keine Anfängersache.
Primär geht es nicht um den praktischen Nutzen des Scanners, sondern um die Methode. (siehe einen Quote weiter oben)Verbessere deinen Code noch(Siehe Hinweise von Vorrednern), dann kann man damit wirklich was anfangen.
Kann ich machen, schreibe morgen jedoch 4 Stunden lang Mathe, hab gerade besseres zu tun. ^^Ach, und Erläuterungen im Code wären schön..zumindest einige wenige...
Lässt sich alles leicht implementieren, da jetzt auch eine OOP-Variante vorliegt. Mal schauen, ob ich noch was dazu mache.z.B. Pingoptionen, variabler IP Bereich, Rückgabe von Pingzeiten,PC Namen auslesen etc)
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »nikeee13« (28. September 2010, 15:23)