2

PCにインターネット接続があるかどうかをテストするために使用されるvb6コードがあります.Google DNSをチェックして使用します.Windows XPでは正常に動作します.しかし、インターネットが接続されているかどうかは常にWindows 8で成功を返します (インターネットが接続されています)。以下はコーディングの一部です

Private Function CheckForInternet(ByVal ServerIP As String, ByRef IsTimedOut As Boolean) A

s Boolean
On Error GoTo CheckForInternet_EH

Dim Reply As ICMP_ECHO_REPLY
Dim lngSuccess As Long
Dim strIPAddress As String
Dim a As String
Dim startTimer As Single
Dim EndTimer As Single
Const Time_out_in_ms As Integer = 1000
'Get the sockets ready.
If SocketsInitialize() Then
    'Address to ping
    strIPAddress = ServerIP

    'Ping the IP that is passing the address and get a reply.
    lngSuccess = ping(strIPAddress, Time_out_in_ms, Reply)

    'Clean up the sockets.
    SocketsCleanup

    ''Return Value
    If lngSuccess = ICMP_SUCCESS Then
        CheckForInternet = True
    ElseIf lngSuccess = ICMP_STATUS_REQUEST_TIMED_OUT Then
        IsTimedOut = True
    End If
'Else
'    'Winsock error failure, initializing the sockets.
'    Debug.Print WINSOCK_ERROR
End If

Exit Function
CheckForInternet_EH:
Call msglog(Err.Description & Space(10) & "CheckForInternet", False)
End Function

そして以下はping手順です

Public Function ping(ByVal sAddress As String, ByVal time_out As Long, Reply As ICMP_ECHO_REPLY) As Long
On Error GoTo ping_EH

Dim hIcmp As Long
Dim lAddress As Long
Dim lTimeOut As Long
Dim StringToSend As String

'Short string of data to send
StringToSend = "hello"

'ICMP (ping) timeout
lTimeOut = time_out ''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()

    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

        'Close the Icmp handle.
        IcmpCloseHandle hIcmp
    Else
        'Debug.Print "failure opening icmp handle."
        ping = -1
    End If
Else
    ping = -1
End If
Exit Function
ping_EH:
Call msglog(Err.Description & Space(10) & "ping", False)
End Function

これはコーディングの一部にすぎません (Google の DNS で sAddress などのパラメーターを適切に渡します)。Windows XP でインターネット接続が存在する場合、ping = Reply.Status が 0 (成功) を返すことを確認しました。 Windows 8でも同じです。ただし、インターネット接続がない場合、Windows XPはping値を11003(インターネット接続がないことを意味します)として返します。しかし、Windows 8では、成功のために0を返します。

したがって、間違った値を返す IcmpSendEcho 関数の問題だと思います

私も以下を定義しました

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

'This structure describes the options that will be included in the header of an IP packet.
'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcetcpip/htm/cerefIP_OPTION_INFORMATION.asp
Private Type IP_OPTION_INFORMATION
   Ttl             As Byte
   Tos             As Byte
   Flags           As Byte
   OptionsSize     As Byte
   OptionsData     As Long
End Type

'This structure describes the data that is returned in response to an echo request.
'http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcesdkr/htm/_wcesdk_icmp_echo_reply.asp
Public Type ICMP_ECHO_REPLY
   address         As Long
   Status          As Long
   RoundTripTime   As Long
   DataSize        As Long
   Reserved        As Integer
   ptrData                 As Long
   Options        As IP_OPTION_INFORMATION
   Data            As String * 250
End Type

ヒント:リンクでもIcmpSendEcho IP_OPTION_INFORMATION は 64 ビット PC とは異なります。応答のオプションとデータによって異なります。バッファーは、少なくとも 1 つの ICMP_ECHO_REPLY 構造と RequestSize バイトのデータを保持するのに十分な大きさである必要があります。」だから私はICMP_ECHO_REPLY32とIP_OPTION_INFORMATION32を宣言する方法を今したいですか?

4

1 に答える 1