Distinct Corporation's ICMP control and WINS query 
Author Message
 Distinct Corporation's ICMP control and WINS query

I have written a VB5 application that pings IP devices by calling
functions in Distinct Corporation's ICMP runtime library.

On my Sniffer I notice that when my application sends a PING echo
request out, my application also sends out a WINS query at UDP port 137
to an IP address which is the reverse of the destination IP address in
the PING echo request packet. For example, if my application is pinging
192.168.249.20, then it is also sending WINS query packets at UDP port
137 to 20.249.168.192. Since the "reverse" address is not on the local
segment and since my routing table does not have a route to this
"reverse" network so my PC sends the packet to the default router. When
the router gets this packet with the "reverse" address it does not know
where to forward so it sends an ICMP destination unreachable (host
unreachable) packet back to my PC.

I ran Distinct Corporation's own ICMP sample program. It behaves in
exactly the same way.

Distinct Corporation said that they implement ICMP according to the RFC
on ICMP ( I assume the RFC is RFC 792). I read the RFC. I do not see any
mention of WINS.

Has anyone encountered the same problem?
I am looking at replacing the Distinct Corporation's stuff with WinSock.
Where can I find information on Winsock programming.

Thanks



Fri, 11 May 2001 03:00:00 GMT  
 Distinct Corporation's ICMP control and WINS query

decided to enlighten us with :

Quote:
>I have written a VB5 application that pings IP devices by calling
>functions in Distinct Corporation's ICMP runtime library.

>On my Sniffer I notice that when my application sends a PING echo
>request out, my application also sends out a WINS query at UDP port 137
>to an IP address which is the reverse of the destination IP address in
>the PING echo request packet. For example, if my application is pinging
>192.168.249.20, then it is also sending WINS query packets at UDP port
>137 to 20.249.168.192. Since the "reverse" address is not on the local
>segment and since my routing table does not have a route to this
>"reverse" network so my PC sends the packet to the default router. When
>the router gets this packet with the "reverse" address it does not know
>where to forward so it sends an ICMP destination unreachable (host
>unreachable) packet back to my PC.

>I ran Distinct Corporation's own ICMP sample program. It behaves in
>exactly the same way.

>Distinct Corporation said that they implement ICMP according to the RFC
>on ICMP ( I assume the RFC is RFC 792). I read the RFC. I do not see any
>mention of WINS.

>Has anyone encountered the same problem?
>I am looking at replacing the Distinct Corporation's stuff with WinSock.
>Where can I find information on Winsock programming.

>Thanks

Simon,
        You cannot use the intrnsic functiond contained in the WinSock
control for PINGing an address, you need to utilize the functions in
ICMP.DLL instead.
        Here's an example I picked up a while ago, I do not know who
the author is (My apologies go out to the author, btw), but this can
get you started at least. I recently wrote a PING application myself,
for a web design client of mine. I found that I had to alter the code
somewhat to get it to work, including utilizing Catalyst's
SocketWrench control to convert the alphanumeric address to an actual
IP number, as neither the WinSock control, nor the WinSock API calls
have worked for me.

'in a module

Option Explicit

Public Const IP_STATUS_BASE = 11000
Public Const IP_SUCCESS = 0
Public Const IP_BUF_TOO_SMALL = (11000 + 1)
Public Const IP_DEST_NET_UNREACHABLE = (11000 + 2)
Public Const IP_DEST_HOST_UNREACHABLE = (11000 + 3)
Public Const IP_DEST_PROT_UNREACHABLE = (11000 + 4)
Public Const IP_DEST_PORT_UNREACHABLE = (11000 + 5)
Public Const IP_NO_RESOURCES = (11000 + 6)
Public Const IP_BAD_OPTION = (11000 + 7)
Public Const IP_HW_ERROR = (11000 + 8)
Public Const IP_PACKET_TOO_BIG = (11000 + 9)
Public Const IP_REQ_TIMED_OUT = (11000 + 10)
Public Const IP_BAD_REQ = (11000 + 11)
Public Const IP_BAD_ROUTE = (11000 + 12)
Public Const IP_TTL_EXPIRED_TRANSIT = (11000 + 13)
Public Const IP_TTL_EXPIRED_REASSEM = (11000 + 14)
Public Const IP_PARAM_PROBLEM = (11000 + 15)
Public Const IP_SOURCE_QUENCH = (11000 + 16)
Public Const IP_OPTION_TOO_BIG = (11000 + 17)
Public Const IP_BAD_DESTINATION = (11000 + 18)
Public Const IP_ADDR_DELETED = (11000 + 19)
Public Const IP_SPEC_MTU_CHANGE = (11000 + 20)
Public Const IP_MTU_CHANGE = (11000 + 21)
Public Const IP_UNLOAD = (11000 + 22)
Public Const IP_ADDR_ADDED = (11000 + 23)
Public Const IP_GENERAL_FAILURE = (11000 + 50)
Public Const MAX_IP_STATUS = 11000 + 50
Public Const IP_PENDING = (11000 + 255)
Public Const PING_TIMEOUT = 200
Public Const WS_VERSION_REQD = &H101
Public Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF&
Public Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
Public Const MIN_SOCKETS_REQD = 1
Public Const SOCKET_ERROR = -1

Public Const MAX_WSADescription = 256
Public Const MAX_WSASYSStatus = 128

Public Type ICMP_OPTIONS
        Ttl As Byte
        Tos As Byte
        Flags As Byte
        OptionsSize As Byte
        OptionsData As Long
End Type

Dim ICMPOPT As ICMP_OPTIONS

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

Public Type HOSTENT
        hName As Long
        hAliases As Long
        hAddrType As Integer
        hLen As Integer
        hAddrList As Long
End Type

Public 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

Public Declare Function IcmpCreateFile Lib "icmp.dll" () As Long

Public Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal
IcmpHandle As Long) As Long

Public 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

Public Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long

Public Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal
wVersionRequired As Long, lpWSADATA As WSADATA) As Long

Public Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long

Public Declare Function gethostname Lib "WSOCK32.DLL" (ByVal szHost As
String, ByVal dwHostLen As Long) As Long

Public Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal szHost
As String) As Long

Public Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As Any, ByVal
hpvSource As Long, ByVal cbCopy As Long)

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

Public Function HiByte(ByVal wParam As Integer)
        HiByte = wParam \ &H100 And &HFF&
End Function

Public 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
        sDataToSend = "Echo This"
        dwAddress = AddressStringToLong(szAddress)
        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)
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

Public 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

Public 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

'in a form

Option Explicit
Private Sub Command1_Click()
        Dim ECHO As ICMP_ECHO_REPLY
        Dim pos As
...

read more »



Sat, 12 May 2001 03:00:00 GMT  
 Distinct Corporation's ICMP control and WINS query
<cut>

Quote:
>Distinct Corporation said that they implement ICMP according to the RFC
>on ICMP ( I assume the RFC is RFC 792). I read the RFC. I do not see any
>mention of WINS.

It would be fairly normal to attempt some sort of name lookup on the IP in
order to provide a nice display for the user.  That is not part of the ICMP
protocol though so Distinct my be correct that the ICMP part of their app is
RFC-compliant but may also be doing other things.  To use Microsoft's
ICMP.DLL see the example I have at
http://home.earthlink.net/~butlerbob/vb/network/tcpip/ping.htm


Sat, 12 May 2001 03:00:00 GMT  
 Distinct Corporation's ICMP control and WINS query
I have written a VB5 application that pings IP devices by calling
functions in Distinct Corporation's ICMP runtime library.

On my Sniffer I notice that when my application sends a PING echo
request out, my application also sends out a WINS query at UDP port 137
to an IP address which is the reverse of the destination IP address in
the PING echo request packet. For example, if my application is pinging
192.168.249.20, then it is also sending WINS query packets at UDP port
137 to 20.249.168.192. Since the "reverse" address is not on the local
segment and since my routing table does not have a route to this
"reverse" network so my PC sends the packet to the default router. When
the router gets this packet with the "reverse" address it does not know
where to forward so it sends an ICMP destination unreachable (host
unreachable) packet back to my PC.

I ran Distinct Corporation's own ICMP sample program. It behaves in
exactly the same way.

Distinct Corporation said that they implement ICMP according to the RFC
on ICMP ( I assume the RFC is RFC 792). I read the RFC. I do not see any

mention of WINS.

Has anyone encountered the same problem?
Since Distinct Corporation is not quite responsive on resolving this
issue, I am looking at replacing the Distinct Corporation's stuff with
WinSock.
Where can I find information on Winsock programming. Please email your

Thanks



Fri, 18 May 2001 03:00:00 GMT  
 
 [ 4 post ] 

 Relevant Pages 

1. Distinct Corporation's ICMP control and WINS query

2. ICMP in VB .NET? (ICMP=Ping)

3. form won't update after query changed in VBA

4. Function won't work in a query

5. action query won't run in macro with setwarning off

6. VB Query won't work

7. Query won't work

8. Visual Database Tools won't excute query.

9. MSINET.OCX *still* won't register, and now IE4 won't install

10. ANN: Abderaware's ICMP for .NET

11. Custom control won't display and problems with building dll's

12. DataList Control won't match user's keystrokes when list too long

 

 
Powered by phpBB® Forum Software