How to Ping an IP address
Posted on July 6, 2010
Here is one of the way to ping a given IP address. Check out the main procedure to call the functions:
Instructions:
- Create a new Project
- Add a new module to it and name it as Module1
Now, add the following code to Module1:
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 | Option Explicit 'Const IP_STATUS_BASE = 11000 Const IP_SUCCESS = 0 Const IP_BUF_TOO_SMALL = (11000 + 1) Const IP_DEST_NET_UNREACHABLE = (11000 + 2) Const IP_DEST_HOST_UNREACHABLE = (11000 + 3) Const IP_DEST_PROT_UNREACHABLE = (11000 + 4) Const IP_DEST_PORT_UNREACHABLE = (11000 + 5) Const IP_NO_RESOURCES = (11000 + 6) Const IP_BAD_OPTION = (11000 + 7) Const IP_HW_ERROR = (11000 + 8) Const IP_PACKET_TOO_BIG = (11000 + 9) Const IP_REQ_TIMED_OUT = (11000 + 10) Const IP_BAD_REQ = (11000 + 11) Const IP_BAD_ROUTE = (11000 + 12) Const IP_TTL_EXPIRED_TRANSIT = (11000 + 13) Const IP_TTL_EXPIRED_REASSEM = (11000 + 14) Const IP_PARAM_PROBLEM = (11000 + 15) Const IP_SOURCE_QUENCH = (11000 + 16) Const IP_OPTION_TOO_BIG = (11000 + 17) Const IP_BAD_DESTINATION = (11000 + 18) Const IP_ADDR_DELETED = (11000 + 19) Const IP_SPEC_MTU_CHANGE = (11000 + 20) Const IP_MTU_CHANGE = (11000 + 21) Const IP_UNLOAD = (11000 + 22) Const IP_ADDR_ADDED = (11000 + 23) Const IP_GENERAL_FAILURE = (11000 + 50) 'Const MAX_IP_STATUS = 11000 + 50 Const IP_PENDING = (11000 + 255) Const PING_TIMEOUT = 200 Const WS_VERSION_REQD = &H101 Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF& Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF& Const MIN_SOCKETS_REQD = 1 'Const SOCKET_ERROR = -1 Const MAX_WSADescription = 256 Const MAX_WSASYSStatus = 128 Type ICMP_OPTIONS Ttl As Byte Tos As Byte Flags As Byte OptionsSize As Byte OptionsData As Long End Type 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 Type HOSTENT hName As Long hAliases As Long hAddrType As Integer hLen As Integer hAddrList As Long End Type 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 Declare Function IcmpCreateFile Lib "icmp.dll" () As Long Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal IcmpHandle As Long) As Long 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 Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long Declare Function gethostname Lib "WSOCK32.DLL" (ByVal szHost As String, ByVal dwHostLen As Long) As Long Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal szHost As String) As Long Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long) 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 Function HiByte(ByVal wParam As Integer) HiByte = wParam \ &H100 And &HFF& End Function Function LoByte(ByVal wParam As Integer) LoByte = wParam And &HFF& End Function Function Ping(szAddress As String, ECHO As ICMP_ECHO_REPLY) As Long Dim hPort As Long, dwAddress As Long Dim sDataToSend As String sDataToSend = "Send this" dwAddress = AddressStringToLong(szAddress) Call SocketsInitialize hPort = IcmpCreateFile() If IcmpSendEcho(hPort, dwAddress, sDataToSend, Len(sDataToSend), 0, ECHO, Len(ECHO), PING_TIMEOUT) Then 'the ping succeeded, '.Status will be 0 '.RoundTripTime is the time in ms for the ping to complete, '.Data is the data returned (NULL terminated) '.Address is the Ip address that actually replied '.DataSize is the size of the string in .Data Ping = ECHO.RoundTripTime Else Ping = ECHO.status * -1 End If Call IcmpCloseHandle(hPort) Call SocketsCleanup End Function Function AddressStringToLong(ByVal tmp As String) As Long Dim I As Integer Dim parts(1 To 4) As String I = 0 'we have to extract each part of the 123.456.789.123 string, delimited by a period 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 'build the long value out of the hex of the extracted strings 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 Function SocketsCleanup() As Boolean Dim X As Long X = WSACleanup() If X <> 0 Then MsgBox "Windows Sockets error " & Trim$(Str$(X)) & " occurred in Cleanup.", vbExclamation SocketsCleanup = False Else SocketsCleanup = True End If End Function 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 MsgBox "Windows Sockets for 32 bit Windows " & "environments is not successfully responding." SocketsInitialize = False Exit Function End If If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or (LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then szHiByte = Trim$(Str$(HiByte(WSAD.wVersion))) szLoByte = Trim$(Str$(LoByte(WSAD.wVersion))) szBuf = "Windows Sockets Version " & szLoByte & "." & szHiByte szBuf = szBuf & " is not supported by Windows " & "Sockets for 32 bit Windows environments." MsgBox szBuf, vbExclamation SocketsInitialize = False Exit Function End If If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then szBuf = "This application requires a minimum of " & Trim$(Str$(MIN_SOCKETS_REQD)) & " supported sockets." MsgBox szBuf, vbExclamation SocketsInitialize = False Exit Function End If SocketsInitialize = True End Function Sub Main() Dim ECHO As ICMP_ECHO_REPLY Call Ping("192.168.1.10", ECHO) Debug.Print GetStatusCode(ECHO.status) End Sub |