icmpsendecho2 的 vb6 实现

vb6 implementation for icmpsendecho2

我正在尝试在 vb6 中实现一个 Ping 程序,它适用于 IPv4 和 IPv6 地址。 IPv4 实现使用 IcmpSendEcho,工作正常,但 IPv6 实现使用 Icmp6SendEcho2,我很难让它工作。

函数调用正常,没有出错,但return值始终为0,GetLastError returns 0表示没有发生错误

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366041(v=vs.85).aspx

我遵循的流程如下:

Icmp6SendEcho2的定义如下

Private Declare Function Icmp6SendEcho2 Lib "Iphlpapi.dll" _
    (ByVal IcmpHandle As Long, _
    ByVal EventtoRaise As Long, _
    ByVal ApcRoutine As Long, _
    ByVal ApcContext As Long, _
    ByVal SourceAddressPointer As Long, _
    ByVal DestinationAddressPointer As Long, _
    ByVal RequestData As String, _
    ByVal RequestSize As Long, _
    ByVal RequestOptions As Long, _
    ReplyBuffer As ICMPV6_ECHO_REPLY, _
    ByVal ReplySize As Long, _
    ByVal timeOut As Long) As Long

其中ICMPV6_ECHO_REPLY定义如下

Private Type ICMPV6_ECHO_REPLY
    Address As IPV6_ADDRESS
    Status As Long
    RoundTripTime As Long
End Type

Private Type IPV6_ADDRESS
    sin6_port As Integer
    sin6_flowinfo As Long
    sin6_addr(1 To 8) As Integer
    sin6_scope_id As Long
End Type

Icmp6SendEcho2的调用如下

lPingResponse = Icmp6SendEcho2(lPortHandle, 0, 0, 0, VarPtr(SourceAddress), VarPtr(DestinationAddress), sMessage, Len(sMessage), 0, Reply, Len(Reply), timeOut)

我使用以下 link 来实现 IPv4 的 Ping https://support.microsoft.com/en-us/kb/300197

任何帮助都会很棒

尼什

此问题与没有足够的缓冲区来获取响应有关。将响应结构更改为类似这样的东西就成功了

Private Type ICMPV6_ECHO_REPLY
  Address As IPV6_ADDRESS
  Status As Long
  RoundTripTime As Long
  data(0 To 1023) As Byte
End Type