pb通过icmp.dll实现ping功能

来源:互联网 发布:咨询数据分析 编辑:程序博客网 时间:2024/06/08 01:09

第一步:定义实例变量

//{ping 一个值
Private constant Long IP_SUCCESS = 0
Private constant long IP_STATUS_BASE = 11000
Private constant long IP_BUF_TOO_SMALL = (11000 + 1)
Private constant long IP_DEST_NET_UNREACHABLE = (11000 + 2)
Private constant long IP_DEST_HOST_UNREACHABLE = (11000 + 3)
Private constant long IP_DEST_PROT_UNREACHABLE = (11000 + 4)
Private constant long IP_DEST_PORT_UNREACHABLE = (11000 + 5)
Private constant long IP_NO_RESOURCES = (11000 + 6)
Private constant long IP_BAD_OPTION = (11000 + 7)
Private constant long IP_HW_ERROR = (11000 + 8)
Private constant long IP_PACKET_TOO_BIG = (11000 + 9)
Private constant long IP_REQ_TIMED_OUT = (11000 + 10)
Private constant long IP_BAD_REQ = (11000 + 11)
Private constant long IP_BAD_ROUTE = (11000 + 12)
Private constant long IP_TTL_EXPIRED_TRANSIT = (11000 + 13)
Private constant long IP_TTL_EXPIRED_REASSEM = (11000 + 14)
Private constant long IP_PARAM_PROBLEM = (11000 + 15)
Private constant long IP_SOURCE_QUENCH = (11000 + 16)
Private constant long IP_OPTION_TOO_BIG = (11000 + 17)
Private constant long IP_BAD_DESTINATION = (11000 + 18)
Private constant long IP_ADDR_DELETED = (11000 + 19)
Private constant long IP_SPEC_MTU_CHANGE = (11000 + 20)
Private constant long IP_MTU_CHANGE = (11000 + 21)
Private constant long IP_UNLOAD = (11000 + 22)
Private constant long IP_ADDR_ADDED = (11000 + 23)
Private constant long IP_GENERAL_FAILURE = (11000 + 50)
Private constant long MAX_IP_STATUS = (11000 + 50)
Private constant long IP_PENDING = (11000 + 255)
Private constant long PING_TIMEOUT = 500
Private constant long WS_VERSION_REQD = 101
Private constant long MIN_SOCKETS_REQD = 1
Private constant long SOCKET_ERROR = -1
Private constant long INADDR_NONE = 4294967295
Private constant long MAX_WSADescription = 256
Private constant long MAX_WSASYSStatus = 128
//}

第二步:定义全局函数

Function ulong IcmpCreateFile () Library "icmp.dll"
Function long IcmpSendEcho (ulong IcmpHandle, ulong DestinationAddress, string RequestData,long RequestSize, long RequestOptions, Ref icmp_echo_reply ReplyBuffer, long ReplySize, long Timeout ) Library "icmp.dll" Alias for "IcmpSendEcho"
Function long IcmpCloseHandle (ulong IcmpHandle) Library "icmp.dll"
Function ulong inet_addr (string cp) Library "ws2_32.dll" Alias for "inet_addr"

第三步:定义两个相关结构

a)icmp_options结构

character tt1

character tos

character flags

character optionsize

long optiondata

b)icmp_echo_reply

long address

long status

long roundtriptime

long datasize

long reserved

long datapointer

icmp_options options

string{250} data

第四步:书写实现功能函数:boolean  w_ping(string ip,string echomsg,ref string msg)

//返回值 ping得通返回true,反之为false,如果为false,可通过形参msg来查看

//

ULong lul_address, lul_handle
Long ll_rc, ll_size
String ls_reply
boolean lb_success = false
icmp_echo_reply lstr_reply
lul_address = inet_addr(as_ipaddress)
If lul_address > 0 Then
 lul_handle = IcmpCreateFile()
 ll_size = Len(as_echomsg)
 ll_rc = IcmpSendEcho(lul_handle,lul_address,as_echomsg,ll_size,0,lstr_reply,278,200)
 IcmpCloseHandle(lul_handle)
 If ll_rc <> 0 Then
  choose case lstr_reply.Status
   Case IP_SUCCESS           
    msg = "ip success"
    lb_success = true
   Case INADDR_NONE
        msg = "inet_addr bad IP format"
   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 choose
//  If lstr_reply.Status = 0 Then
//   ls_reply = String(lstr_reply.Data)
//   If ls_reply = as_echomsg Then
//    Return True
//   End If 
//  End If 
 End If
End If
Return lb_success
////True 表示PING成功,反之失败
//

总结:

其中涉及到 icmp.dll的相关知识,请参考微软的msdn

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecomm5/html/wce50grficmpfunctions.asp

另外本代码参考了国外的vb的代码:

http://vbnet.mvps.org/index.html?code/internet/ping.htm