Vb6 IcmpSendEcho,此函数是否有数据限制?

Vb6 IcmpSendEcho,此函数是否有数据限制?,vb6,Vb6,我在VB6中调用IcmpSendEcho来测试一个设备的以太网协议。 以太网的MTU是1500字节,所以我尝试发送1500字节,但VB6不允许我这样做。 它只允许我发送1014个字节,当我发送1014个字节时,IcmpSendEcho会给我一般失败的错误 当我发送250字节时,它工作得很好,但如果我发送的字节超过250字节,它会给我错误提示 我想不出这个问题。以太网协议最多可以处理1500字节,而我的甚至不能处理250字节。是否有任何方法来调试或解决此问题 Private Declare F

我在VB6中调用IcmpSendEcho来测试一个设备的以太网协议。 以太网的MTU是1500字节,所以我尝试发送1500字节,但VB6不允许我这样做。 它只允许我发送1014个字节,当我发送1014个字节时,IcmpSendEcho会给我一般失败的错误

当我发送250字节时,它工作得很好,但如果我发送的字节超过250字节,它会给我错误提示

我想不出这个问题。以太网协议最多可以处理1500字节,而我的甚至不能处理250字节。是否有任何方法来调试或解决此问题

  Private Declare Function IcmpSendEcho Lib "icmp.dll" _
   (ByVal IcmpHandle As Long, _
    ByVal DestinationAddress As Long, _
    ByVal RequestData As String, _
    ByVal RequestSize As Long, _
    ByVal RequestOptions As Long, _
    ReplyBuffer As ICMP_ECHO_REPLY, _
    ByVal ReplySize As Long, _
    ByVal Timeout As Long) As Long

 Public Function ping(sAddress As String, Reply As ICMP_ECHO_REPLY) As Long

    Dim hIcmp As Long
Dim lAddress As Long
Dim lTimeOut As Long
Dim StringToSend As String
Dim PingOutput As String 'Variable that shows Ping status
Dim Index As Integer


'Short string of data to send
    '400byte
StringToSend = "ddd...." 'First of all I can't put more than 1014 characters in string. 
                     'Secondly, "ddd..." is just example, putting 1014 will make it so messy
                     ' I declared  
'ICMP (ping) timeout
lTimeOut = 1000 'ms

'Convert string address to a long representation.
lAddress = inet_addr(sAddress)

If (lAddress <> -1) And (lAddress <> 0) Then

'Create the handle for ICMP requests.
hIcmp = IcmpCreateFile()

Do
If hIcmp Then
    'Ping the destination IP address.
    Call IcmpSendEcho(hIcmp, lAddress, StringToSend, Len(StringToSend), 0, Reply, Len(Reply), lTimeOut)

    'Reply status
    ping = Reply.Status
    PingOutput = EvaluatePingResponse(ping)
    If ping = 0 Then
        Index = Index + 1
    Else
        MsgBox (PingOutput)
        Exit Do
    End If
    'Close the Icmp handle.
    'IcmpCloseHandle hIcmp
Else
    Debug.Print "failure opening icmp handle."
    ping = -1
End If
Loop Until (Index > 1000)
'Close the Icmp handle.
IcmpCloseHandle hIcmp

Else
    ping = -1
End If

End Function

您的代码不能立即运行,因此我必须从Win32文档中找出所有缺少的定义。您在IcmpSendEcho的定义中也犯了一些错误。RequestSize参数定义为:

_在字大小中

。。。它相当于VB6的整数类型,不长

然而,主要的问题可能是您没有为ReplyBuffer分配足够的空间。从您的示例中不明显看出您是如何分配此缓冲区的。该规范实际上要求一个ICMP_ECHO_REPLY数组,后跟额外数据。为了确保这一点,我创建了一个新类型ReplyBuffer,并分配了比我需要的更多的空间:

Private Const m_knImcpEchoReplyCount    As Long = 8
Private Const m_knReplyDataSize         As Long = 4096

Public Type ReplyBuffer
    IER(1 To m_knImcpEchoReplyCount)       As IMCP_ECHO_REPLY
    Data(1 To m_knReplyDataSize)           As Byte
End Type
然后,我在调用IcmpSendEcho时传递ReplyBuffer:=uReplyBuffer.IER1和ReplySize:=LenBuReplyBuffer

摆弄这两个常数,直到你对此感到满意为止。您可能只需要将m_knicpechoreplycount设置为1。至于m_knReplyDataSize,它需要大于您发送的最大字符串

我的全部代码如下:

Option Explicit

Public Enum PingStatus
     IP_SUCCESS = 0
     IP_BUF_TOO_SMALL = 11001
     IP_DEST_NET_UNREACHABLE = 11002
     IP_DEST_HOST_UNREACHABLE = 11003
     IP_DEST_PROT_UNREACHABLE = 11004
     IP_DEST_PORT_UNREACHABLE = 11005
     IP_NO_RESOURCES = 11006
     IP_BAD_OPTION = 11007
     IP_HW_ERROR = 11008
     IP_PACKET_TOO_BIG = 11009
     IP_REQ_TIMED_OUT = 11010
     IP_BAD_REQ = 11011
     IP_BAD_ROUTE = 11012
     IP_TTL_EXPIRED_TRANSIT = 11013
     IP_TTL_EXPIRED_REASSEM = 11014
     IP_PARAM_PROBLEM = 11015
     IP_SOURCE_QUENCH = 11016
     IP_OPTION_TOO_BIG = 11017
     IP_BAD_DESTINATION = 11018
     IP_GENERAL_FAILURE = 11050
End Enum

Public Type IPAddr
     s_b1 As Byte
     s_b2 As Byte
     s_b3 As Byte
     s_b4 As Byte
End Type

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

Public Type IMCP_ECHO_REPLY
     Address             As IPAddr
     Status              As PingStatus
     RoundTripTime       As Long
     DataSize            As Integer
     Reserved            As Integer
     Data                As Long
     Options             As IP_OPTION_INFORMATION
End Type

Private Const m_knImcpEchoReplyCount    As Long = 8
Private Const m_knReplyDataSize         As Long = 4096

Public Type ReplyBuffer
     IER(1 To m_knImcpEchoReplyCount)       As IMCP_ECHO_REPLY
     Data(1 To m_knReplyDataSize)           As Byte
End Type

  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, _
     ByRef ReplyBuffer As IMCP_ECHO_REPLY, _
     ByVal ReplySize As Long, _
     ByVal Timeout As Long) As Long

Private Declare Function inet_addr Lib "Ws2_32.dll" ( _
     ByVal cp As String _
) As Long

Private Declare Function IcmpCreateFile Lib "Iphlpapi.dll" () As Long
Private Declare Function IcmpCloseHandle Lib "Iphlpapi.dll" (ByVal IcmpHandle As Long) As Long

Public Function Ping(sAddress As String, Reply As ReplyBuffer) As PingStatus

    Dim hIcmp As Long
    Dim lAddress As Long
    Dim lTimeOut As Long
    Dim StringToSend As String
    Dim PingOutput As String 'Variable that shows Ping status Dim Index As Integer
    Dim Index As Long


    'Short string of data to send
         '400byte
    'StringToSend = "ddd...." 'First of all I can't put more than 1014 characters in string.
                          'Secondly, "ddd..." is just example, putting 1014 will make it so messy
                          ' I declared
    StringToSend = String$(2048, 32)


    'ICMP (ping) timeout
    lTimeOut = 1000 'ms

    'Convert string address to a long representation.
    lAddress = inet_addr(sAddress)

    If (lAddress <> -1) And (lAddress <> 0) Then

    'Create the handle for ICMP requests.
    hIcmp = IcmpCreateFile()

    Do
    If hIcmp Then
         'Ping the destination IP address.
         Call IcmpSendEcho(hIcmp, lAddress, StringToSend, Len(StringToSend), 0, Reply.IER(1), LenB(Reply), lTimeOut)

         'Reply status
         Ping = Reply.IER(1).Status
         PingOutput = EvaluatePingResponse(Ping)
         If Ping = 0 Then
             Index = Index + 1
         Else
             MsgBox (PingOutput)
             Exit Do
         End If
         'Close the Icmp handle.
         'IcmpCloseHandle hIcmp
    Else
         Debug.Print "failure opening icmp handle."
         Ping = -1
    End If
    Loop Until (Index > 1000)
    'Close the Icmp handle.
    IcmpCloseHandle hIcmp

    Else
         Ping = -1
    End If

End Function

Private Function EvaluatePingResponse(ByVal Ping As PingStatus) As String

     Select Case Ping
     Case IP_SUCCESS
         EvaluatePingResponse = "The status was success."
     Case IP_BUF_TOO_SMALL
         EvaluatePingResponse = "The reply buffer was too small."
     Case IP_DEST_NET_UNREACHABLE
         EvaluatePingResponse = "The destination network was unreachable."
     Case IP_DEST_HOST_UNREACHABLE
         EvaluatePingResponse = "The destination host was unreachable."
     Case IP_DEST_PROT_UNREACHABLE
         EvaluatePingResponse = "The destination protocol was unreachable."
     Case IP_DEST_PORT_UNREACHABLE
         EvaluatePingResponse = "The destination port was unreachable."
     Case IP_NO_RESOURCES
         EvaluatePingResponse = "Insufficient IP resources were available."
     Case IP_BAD_OPTION
         EvaluatePingResponse = "A bad IP option was specified."
     Case IP_HW_ERROR
         EvaluatePingResponse = "A hardware error occurred."
     Case IP_PACKET_TOO_BIG
         EvaluatePingResponse = "The packet was too big."
     Case IP_REQ_TIMED_OUT
         EvaluatePingResponse = "The request timed out."
     Case IP_BAD_REQ
         EvaluatePingResponse = "A bad request."
     Case IP_BAD_ROUTE
         EvaluatePingResponse = "A bad route."
     Case IP_TTL_EXPIRED_TRANSIT
         EvaluatePingResponse = "The time to live (TTL) expired in transit."
     Case IP_TTL_EXPIRED_REASSEM
         EvaluatePingResponse = "The time to live expired during fragment reassembly."
     Case IP_PARAM_PROBLEM
         EvaluatePingResponse = "A parameter problem."
     Case IP_SOURCE_QUENCH
         EvaluatePingResponse = "Datagrams are arriving too fast to be processed and datagrams may have been discarded."
     Case IP_OPTION_TOO_BIG
         EvaluatePingResponse = "An IP option was too big."
     Case IP_BAD_DESTINATION
         EvaluatePingResponse = "A bad destination."
     Case IP_GENERAL_FAILURE
         EvaluatePingResponse = "A general failure. This error can be returned for some malformed ICMP packets."
     End Select

End Function

你能展示你的问题的最小数量的代码吗?@MarkBertenshaw我把我有问题的代码放在这里谢谢你,Mark。我想问题出在回复缓冲区。我很抱歉,我没有把全部代码放在那里。IMCHP_ECHO_REPLY中的My Data变量被定义为数据字符串*250;这造成了一个问题。