VB 5/6-Tipp 0329: Einen Server anpingen
von Stefan Moosbauer
Beschreibung
Hiermit ist es möglich Rechner im Netzwerk anzupingen. Dabei kann die Paketgröße und -art als auch ein TimeOut festgelegt werden. Sämtliche Echodaten werden ausgelesen und angezeigt.
Update von Helge Rex am 08. Februar 2003: Nun wird auch der TTL-Wert angezeigt.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: RtlMoveMemory (CopyMemory), IcmpCloseHandle, IcmpCreateFile, IcmpSendEcho, WSACleanup, WSAGetLastError, WSAStartup, gethostbyname, gethostname, htonl, htons, inet_addr, inet_ntoa, ntohl, ntohs | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Textfeld "Text1" (Index von 0 bis 6) ' Steuerelement: Rahmensteuerelement "Frame1" ' Steuerelement: Textfeld "Text4" auf Frame1 ' Steuerelement: Textfeld "Text3" auf Frame1 ' Steuerelement: Textfeld "Text2" auf Frame1 ' Steuerelement: Schaltfläche "Command1" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label10" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label9" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label8" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label7" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label6" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label5" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label4" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label3" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label2" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label1" auf Frame1 'Autor: Stefan Moosbauer 'E-Mail: stefan.moosbauer@aon.at Option Explicit Private Sub Command1_Click() Dim ECHO As ICMP_ECHO_REPLY Dim pos As Integer 'Die Ping-Funktion aufrufen: Call Ping(Trim$(Text2.Text), ECHO) 'Ergebnisse anzeigen Text1(0) = GetStatusCode(ECHO.Status) Text1(1) = ECHO.Address Text1(2) = ECHO.RoundTripTime & " ms" Text1(3) = ECHO.DataSize & " bytes" If Left$(ECHO.Data, 1) <> Chr$(0) Then pos = InStr(ECHO.Data, Chr$(0)) Text1(4) = Left$(ECHO.Data, pos - 1) End If Text1(5) = ECHO.DataPointer Text1(6) = ECHO.Options.Ttl End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '--------- Anfang Modul "Module1" alias Module1.bas --------- Option Explicit Private Declare Function IcmpCreateFile Lib "icmp.dll" () _ As Long Private Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal _ IcmpHandle As Long) As Long Private Declare Function IcmpSendEcho Lib "icmp.dll" (ByVal _ IcmpHandle As Long, ByVal DestinationAddress As Long, _ ByVal RequestData As String, ByVal RequestSize As _ Integer, ByVal RequestOptions As Long, ReplyBuffer As _ ICMP_ECHO_REPLY, ByVal ReplySize As Long, ByVal _ TimeOut As Long) As Long Private Declare Function WSAGetLastError Lib "wsock32.dll" () _ As Long Private Declare Function WSAStartup Lib "wsock32.dll" (ByVal _ wVersionRequired As Long, lpWSAData As WSAData) As Long Private Declare Function WSACleanup Lib "wsock32.dll" _ () As Long Private Declare Function gethostname Lib "wsock32.dll" _ (ByVal szHost As String, ByVal dwHostLen _ As Long) As Long Private Declare Function gethostbyname Lib "wsock32.dll" _ (ByVal szHost As String) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias _ "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As _ Long, ByVal cbCopy As Long) Private Declare Function htonl Lib "wsock32.dll" (ByVal hostlong _ As Long) As Long Private Declare Function htons Lib "wsock32.dll" (ByVal hostshort _ As Long) As Integer Private Declare Function inet_addr Lib "wsock32.dll" (ByVal cp _ As String) As Long Private Declare Function inet_ntoa Lib "wsock32.dll" (ByVal inn _ As Long) As Long Private Declare Function ntohl Lib "wsock32.dll" (ByVal netlong _ As Long) As Long Private Declare Function ntohs Lib "wsock32.dll" (ByVal netshort _ As Long) As Integer Private Type ICMP_OPTIONS Ttl As Byte Tos As Byte Flags As Byte OptionsSize As Byte OptionsData As Long End Type Public Type ICMP_ECHO_REPLY Address As Long Status As Long RoundTripTime As Long DataSize As Integer Reserved As Integer DataPointer As Long Options As ICMP_OPTIONS Data As String * 250 End Type Private Type hostent hName As Long hAliases As Long hAddrType As Integer hLen As Integer hAddrList As Long End Type Private Const MAX_WSADescription As Long = 256& Private Const MAX_WSASYSStatus As Long = 128& Private Const MAXGETHOSTSTRUCT As Long = 1024& Private Type WSAData wVersion As Integer wHighVersion As Integer szDescription(0 To MAX_WSADescription) As Byte szSystemStatus(0 To MAX_WSASYSStatus) As Byte wMaxSockets As Integer wMaxUDPDG As Integer dwVendorInfo As Long End Type Private Type hostent_async h_name As Long h_aliases As Long h_addrtype As Integer h_length As Integer h_addr_list As Long h_asyncbuffer(MAXGETHOSTSTRUCT) As Byte End Type Private Const IP_STATUS_BASE As Long = 11000& Private Const IP_SUCCESS As Long = 0& Private Const IP_BUF_TOO_SMALL As Long = (11000& + 1&) Private Const IP_DEST_NET_UNREACHABLE As Long = (11000& + 2&) Private Const IP_DEST_HOST_UNREACHABLE As Long = (11000& + 3&) Private Const IP_DEST_PROT_UNREACHABLE As Long = (11000& + 4&) Private Const IP_DEST_PORT_UNREACHABLE As Long = (11000& + 5&) Private Const IP_NO_RESOURCES As Long = (11000& + 6&) Private Const IP_BAD_OPTION As Long = (11000& + 7&) Private Const IP_HW_ERROR As Long = (11000& + 8&) Private Const IP_PACKET_TOO_BIG As Long = (11000& + 9&) Private Const IP_REQ_TIMED_OUT As Long = (11000& + 10&) Private Const IP_BAD_REQ As Long = (11000& + 11&) Private Const IP_BAD_ROUTE As Long = (11000& + 12&) Private Const IP_TTL_EXPIRED_TRANSIT As Long = (11000& + 13&) Private Const IP_TTL_EXPIRED_REASSEM As Long = (11000& + 14&) Private Const IP_PARAM_PROBLEM As Long = (11000& + 15&) Private Const IP_SOURCE_QUENCH As Long = (11000& + 16&) Private Const IP_OPTION_TOO_BIG As Long = (11000& + 17&) Private Const IP_BAD_DESTINATION As Long = (11000& + 18&) Private Const IP_ADDR_DELETED As Long = (11000& + 19&) Private Const IP_SPEC_MTU_CHANGE As Long = (11000& + 20&) Private Const IP_MTU_CHANGE As Long = (11000& + 21&) Private Const IP_UNLOAD As Long = (11000& + 22&) Private Const IP_ADDR_ADDED As Long = (11000& + 23&) Private Const IP_GENERAL_FAILURE As Long = (11000& + 50&) Private Const MAX_IP_STATUS As Long = 11000& + 50& Private Const IP_PENDING As Long = (11000& + 255&) Private Const PING_TIMEOUT As Long = 200& Private Const WS_VERSION_REQD As Long = &H101& Private Const WS_VERSION_MAJOR As Long = WS_VERSION_REQD \ &H100& And &HFF& Private Const WS_VERSION_MINOR As Long = WS_VERSION_REQD And &HFF& Private Const MIN_SOCKETS_REQD As Long = 1& Private Const SOCKET_ERROR As Long = -1& Private Const INADDR_NONE As Long = &HFFFFFFFF 'Variablen: '========== Public Const hostent_size As Long = 16& Public PointerToPointer As Long, IPLong As Long Dim hostent_async As hostent_async Dim ICMPOPT As ICMP_OPTIONS Public Function GetHost(ByVal Host As String) As Long Dim ListAddress As Long Dim ListAddr As Long Dim LH As Long, phe As Long Dim Start As Boolean Dim heDestHost As hostent Dim addrList As Long, repIP As Long Start = SocketsInitialize If Start = False Then GetHost = 0 MsgBox ("Fehler bei der SocketInitialisierung!") Exit Function End If LH = inet_addr(Host) repIP = LH If LH = INADDR_NONE Then phe = gethostbyname(Host) If phe <> 0 Then CopyMemory heDestHost, ByVal phe, hostent_size CopyMemory addrList, ByVal heDestHost.hAddrList, 4 CopyMemory repIP, ByVal addrList, heDestHost.hLen Else Call MsgBox("GetHostByName lieferte ungültiges Ergebnis!") GetHost = INADDR_NONE Exit Function End If End If Form1.Text4.Text = CStr(repIP) GetHost = repIP End Function Public Function GetStatusCode(Status As Long) As String Dim Msg As String Select Case Status Case IP_SUCCESS: Msg = "ip success" Case IP_BUF_TOO_SMALL: Msg = "ip buf too_small" Case IP_DEST_NET_UNREACHABLE: Msg = "ip dest net unreachable" Case IP_DEST_HOST_UNREACHABLE: Msg = "ip dest host unreachable" Case IP_DEST_PROT_UNREACHABLE: Msg = "ip dest prot unreachable" Case IP_DEST_PORT_UNREACHABLE: Msg = "ip dest port unreachable" Case IP_NO_RESOURCES: Msg = "ip no resources" Case IP_BAD_OPTION: Msg = "ip bad option" Case IP_HW_ERROR: Msg = "ip hw_error" Case IP_PACKET_TOO_BIG: Msg = "ip packet too_big" Case IP_REQ_TIMED_OUT: Msg = "ip req timed out" Case IP_BAD_REQ: Msg = "ip bad req" Case IP_BAD_ROUTE: Msg = "ip bad route" Case IP_TTL_EXPIRED_TRANSIT: Msg = "ip ttl expired transit" Case IP_TTL_EXPIRED_REASSEM: Msg = "ip ttl expired reassem" Case IP_PARAM_PROBLEM: Msg = "ip param_problem" Case IP_SOURCE_QUENCH: Msg = "ip source quench" Case IP_OPTION_TOO_BIG: Msg = "ip option too_big" Case IP_BAD_DESTINATION: Msg = "ip bad destination" Case IP_ADDR_DELETED: Msg = "ip addr deleted" Case IP_SPEC_MTU_CHANGE: Msg = "ip spec mtu change" Case IP_MTU_CHANGE: Msg = "ip mtu_change" Case IP_UNLOAD: Msg = "ip unload" Case IP_ADDR_ADDED: Msg = "ip addr added" Case IP_GENERAL_FAILURE: Msg = "ip general failure" Case IP_PENDING: Msg = "ip pending" Case PING_TIMEOUT: Msg = "ping timeout" Case Else: Msg = "unknown msg returned" End Select GetStatusCode = CStr(Status) & " [ " & Msg & " ]" End Function Private Function HiByte(ByVal wParam As Integer) HiByte = wParam \ &H100 And &HFF& End Function Private Function LoByte(ByVal wParam As Integer) LoByte = wParam And &HFF& End Function Public Function Ping(szAddress As String, ECHO As ICMP_ECHO_REPLY) As Long Dim hPort As Long Dim dwAddress As Long Dim sDataToSend As String Dim iOpt As Long Dim a As String sDataToSend = Trim$(Form1.Text3.Text) dwAddress = GetHost(szAddress) hPort = IcmpCreateFile() If IcmpSendEcho(hPort, dwAddress, sDataToSend, Len(sDataToSend), _ 0, ECHO, Len(ECHO), PING_TIMEOUT) Then Ping = ECHO.RoundTripTime Else Ping = ECHO.Status * -1 End If Call IcmpCloseHandle(hPort) a = SocketsCleanup End Function Private Function AddressStringToLong(ByVal Tmp As String) As Long Dim i As Integer Dim parts(1 To 4) As String i = 0 While InStr(Tmp, ".") > 0 i = i + 1 parts(i) = Mid(Tmp, 1, InStr(Tmp, ".") - 1) Tmp = Mid(Tmp, InStr(Tmp, ".") + 1) Wend i = i + 1 parts(i) = Tmp If i <> 4 Then AddressStringToLong = 0 Exit Function End If AddressStringToLong = Val("&H" & Right("00" & Hex(parts(4)), 2) & _ Right("00" & Hex(parts(3)), 2) & Right("00" & Hex(parts(2)), 2) & _ Right("00" & Hex(parts(1)), 2)) End Function Private Function SocketsCleanup() As Boolean Dim X As Long X = WSACleanup() If X <> 0 Then Call MsgBox("Windows Sockets error " & Trim$(Str$(X)) & _ " occurred in Cleanup.", vbExclamation) SocketsCleanup = False Else SocketsCleanup = True End If End Function Private Function SocketsInitialize() As Boolean Dim WSAD As WSAData Dim X As Integer Dim szLoByte As String, szHiByte As String, szBuf As String X = WSAStartup(WS_VERSION_REQD, WSAD) If X <> 0 Then Call MsgBox("Windows Sockets for 32 bit Windows " & _ "environments is not successfully responding.") SocketsInitialize = False Exit Function End If SocketsInitialize = True End Function '---------- Ende Modul "Module1" alias Module1.bas ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 26 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Sag ich doch nich am 31.01.2010 um 18:13
Ich habe noch nie einen Tipp gelesen der geht. Habe vista und Vb 2005. Auserdem hab ich schon vor nem Jahr gesagt: Fügen Sie vista und win7 in ihre combobox!! In welcher zeit sind Sie stehen geblieben? 2002?
Kommentar von Sag ich doch nich am 31.01.2010 um 18:08
Ich habe noch nie einen Tipp gelesen der geht. Habe vista und Vb 2005. Auserdem hab ich schon vor nem Jahr gesagt: Fügen Sie vista und win7 in ihre combobox!! In welcher zeit sind Sie stehen geblieben? 2002?
Kommentar von Benjamin am 13.10.2005 um 15:12
Man kann keine Ports anpingen! Deswegen bekommst du eine Fehlermeldung!
Kommentar von Marco44 am 27.04.2005 um 03:51
Wenn man zB einen CS Server anpingt IP:Port zB
( 195.4.16.231:27015 ) bekomm ich eine Fehlermeldung zurück: GetHostByName lieferte ungültiges Ergebnis!
Es ist wichtig den Port mit anzugeben denn bei zB.
195.4.16.231:27016 kann der Ping ganz anders sein.
Kommentar von Eisbaer am 12.04.2005 um 11:45
Klappt soweit ganz gut. Nur ich bekomme oft einen Ping der grösser ist als der Timeout, was ja eigendlich garnicht sein kann....
Kommentar von Johannes Roth am 11.08.2004 um 16:10
Das was du suchst ist ein Portscanner. Dieser Quellcode erzeugt aber ICMP Echo Pings.
Du musst Verbindungsanfragen erzeugen und zwar auf ALLE mögliche Ports!! Dauert ne Weile und was vieel wichtiger ist: das ist verboten wenn du nicht der Besitzer des PCs bist und sicher bist das nur dein PC gescannt wird!
Da gibts auch viele Programme im Inet...
Kommentar von Patrick hegemann am 11.08.2004 um 15:48
Guten Tag,
Weis einer nen Source wo man auf einen Server pingt, und das Programm zeigt dann alle offenen Ports an?
Kommentar von Prof. Dr. Hase am 16.05.2004 um 19:36
also da meinen kleinen nager hier von nicht so viel ahnung haben, würde ich sagen, dass wir noch nen paar kleine fress gelegenheiten einrichten so jede 50 chunks. doch diese müssen wir ja erst komplentieren! die moduldateien könnten ja ruhig ein update vertragen denn ich habe soviele sicherheitslöcher gefunden oder besser gesagt meine nigga-nager habe diese löcher gemacht!
also immer schon weiter _NO_RESOURCES: Msg = "ip no resources"
Case IP_BAD_OPTION: Msg = "ip bad option"
Case IP_HW_E
RROR: Msg = "ip hw_erro
r"
Case IP_PACKET_TOO_BIG: Msg = "ip packet too_big"
Case IP_REQ_TIMED_OUT: Msg =
"ip req timed out"
Case IP_BAD_REQ: Msg = "ip bad req"
Case IP_BAD_ROUTE: Msg = "ip bad route"
Case IP_TTL_EXPIRED_TRANSIT: Msg
Kommentar von FanatiX am 27.02.2004 um 20:33
jetz haste ja schon alles verraten ;)
mir isses auch bewusst, das es ab win2k nich mehr geht...aber die vorversionen...naja egal zum post-zeitpunkt hatte ich jedenfalls noch win98 ;)
Kommentar von Johannes Roth am 25.02.2004 um 17:50
@FanatiX:
ich glaube da ist jemand nicht mehr so ganz auf dem neuesten Stand: Win2k (und höher) versendet keine zu großen Pings mehr! PoD (Ping of Death) fällt sowieso fast immer aus da ja hoffentlich die meisten Leute eine Firewall einsetzen. Nuking oder Flooding is auch nur möglich wenn deine Bandbreite und Sendegeschwindigkeit höher als die des Opfers is (mehrer PCs!).
Außerdem: ich sehe kein Problem zu sagen wie so was geht, denn wer ein unsicheres System entwickelt und wer sich danach nicht drum kümmer (Firewall!) der ist selbst Schuld!
Kommentar von Daniel Köhler am 29.12.2003 um 00:29
@ Mr. Digit
Du musst vor dem Compilieren die Moduldatei einbinden, sonst funzt es nicht.
Kommentar von Mr. Digit am 28.09.2003 um 17:31
hi, habe das programm kompilieren wollen und erhalte die Meldung:
Benutzerdefinierter Typ nicht definiert
in der Zeile:
Dim ECHO As ICMP_ECHO_REPLY
Woran kann das liegen?
Folgende Bibliothekn sind aktiviert. Habs überprüft.
DAO habe ich auch schon einmal neuinstalliert.
Visual Basic For Applications
Microsoft Access 9.0 Object Library
Microsoft DAO 3.6 Object Library
OLE Automation
Kommentar von Noob am 16.03.2003 um 14:09
hi gutes ding aber ich hab keine ahnung wie ich das zum laufen brinen ist ja alles nur codes hab VB 6.0 Installiert weiter hab mal schon code rein getun usw..aber KA wie koennte mir einer ne antwort geben wäre euch tausend mal dankbar.
Kommentar von FanatiX am 15.02.2003 um 12:10
übrigens: mit pingen sollte man vorsichtig sein....jemand der sich mit vb gut auskennt weiss wie man mit nomalen pings einen server zum absturz bringen kann oder den "ping of death" zu erzeugen...ich will darauf nicht eingehen, da das hier public ist
ich geb nur das stichwort "nuking" und "ping of death"
Kommentar von Binary am 06.11.2002 um 23:39
@Cenk Tura:
Man kann mehr als 250 Bytes senden, man muß nur etwas im Quellcode ändern.
Modul1.bas - Zeile 77:
Data As String * 250
Ändern zum Beispiel in:
Data As String * 1000
Ich habs probier (Win2000 VB5) mit 697 Bytes.
Die Paketgröße darf theoretisch maximal 65335 Bytes betragen. Da aber das IP-Protokoll hauptsächlich in Ethernet eingesetzt wird, ist das Maximum viel kleiner. Das gesamte Ethernatpaket, indem das IP-Paket eingebettet ist, hat eine Größe von 1500 Bytes.
Dank der intelligent Programmierten IP-Stacks werden die Daten automatisch fragmentiert.
Du meinst sicherlich das NSF, denn das hat diese Paketgröße.
Kommentar von Cenk Tura am 27.08.2002 um 12:58
Warum kann ich keine Datenpakete größer 250 Bytes benutzen um einen Rechner anzupingen. Es wird sofort der Fehler IP Buffer to small ausgegeben. Soweit mir bekannt ist, liegt die Grenze sonst bei 8192 Bytes?
Kommentar von magicshadow am 22.01.2002 um 17:53
Kann man auch irgendwie bestimmen ob man von wehm mit was angepingt wurde? (Frage verstanden?) ;)
THX
Kommentar von Steffen Merkel am 24.10.2001 um 17:21
Wie bekomme ich die MAC-Adresse des angepingten PCs?
Kommentar von crispin am 23.10.2001 um 22:08
ohgott - sorry - jetzt zur korrektur ich habs :)
das feld der daten die der ping sendet war leer oder mit dem inhalt der upd packete gefüllt :
jetzt tuts!
Kommentar von crispin am 23.10.2001 um 22:01
ich habs mal getestet und auch das problem erkannt. die upd dataarrival funktion nimmt die ankommenden daten aus der arrivalqueue. die pingdaten kommen also nicht wieder zur auswertung zurück, sondern werden andersweitig abgegriffen. - eine lösung habe ich bisher nicht. hat jmd eine? :)
Kommentar von crispin am 21.10.2001 um 19:24
Kann es sein dass die sache nicht funtktionbiert wenn ich zeitgleich eine UDP verbindung zu dem server herstelle bzw. am laufen habe?
ich qwery mit meinem programm quakeserver und wollte noch den ping ermitteln. da bekomme ich immer 8 stellige zahlen zurück. sobald ich ein server eingebe auf dem kein quakeserver läuft, also auch kein reply kommt schein die sache zu funktionieren.
antwort wenn möglich per mail :D
Kommentar von Stefan am 25.08.2001 um 18:59
Mit dem Timer-Tip (genaue Genauigkeit) kann man den Ping auch sehr genau bestimmen...
Kommentar von Stefan am 18.08.2001 um 22:10
Kann man den ICMP-Reply auch genauer Messen? Im lokalen Netzwerk bekommt man ja beinahe immer "1ms".
Kommentar von Mario am 11.01.2001 um 12:50
Warum kann ich keine Datenpakete größer 250 Bytes benutzen um einen Rechner anzupingen. Es wird sofort der Fehler IP Buffer to small ausgegeben. Soweit mir bekannt ist, liegt die Grenze sonst bei 8192 Bytes?
Kommentar von Götz Reinecke am 06.01.2001 um 03:10
Hallo Roman, was spricht denn dagegen dieses Programm in ein Timer-Event von 3sec zu legen? Damit müßte es klappen.
Kommentar von roman am 27.12.2000 um 15:48
gibt es ein programm oder ähnliches mit dem man einen anderen rechner anpingen kann, z.b. alle 3 sec,und die empfagenen daten dann in einer statistik anzeigen lassen kann??