【问题标题】:Check for network connectivity检查网络连接
【发布时间】:2010-09-10 18:03:13
【问题描述】:

我正在构建一个简单的应用程序来监听NetworkAvailibilityChanged 事件。一切都很好,除了调制解调器 PPP 接口连接,应用程序仅在网络连接时才收到可用性通知,而在断开连接时不会收到通知。

我错过了什么吗?我在局域网上试了一下,效果很好。

【问题讨论】:

    标签: c# .net networking


    【解决方案1】:

    这是 NetworkAvailbilityChanged 所涉及的内容。

    Friend Shared Function InternalGetIsNetworkAvailable() As Boolean
        If ComNetOS.IsWinNt Then
            Dim interface2 As NetworkInterface
            For Each interface2 In SystemNetworkInterface.GetNetworkInterfaces
                If (((interface2.OperationalStatus = OperationalStatus.Up) AndAlso (interface2.NetworkInterfaceType <> NetworkInterfaceType.Tunnel)) AndAlso (interface2.NetworkInterfaceType <> NetworkInterfaceType.Loopback)) Then
                    Return True
                End If
            Next
            Return False
        End If
        Dim flags As UInt32 = 0
        Return UnsafeWinINetNativeMethods.InternetGetConnectedState((flags), 0)
    End Function
    
    Private Shared Sub ChangedAddress(ByVal sender As Object, ByVal eventArgs As EventArgs)
        SyncLock AvailabilityChangeListener.syncObject
            Dim isNetworkAvailable As Boolean = SystemNetworkInterface.InternalGetIsNetworkAvailable
            If (isNetworkAvailable <> AvailabilityChangeListener.isAvailable) Then
                AvailabilityChangeListener.isAvailable = isNetworkAvailable
                Dim array As DictionaryEntry() = New DictionaryEntry(AvailabilityChangeListener.s_availabilityCallerArray.Count  - 1) {}
                AvailabilityChangeListener.s_availabilityCallerArray.CopyTo(array, 0)
                Dim i As Integer
                For i = 0 To array.Length - 1
                    Dim key As NetworkAvailabilityChangedEventHandler = DirectCast(array(i).Key, NetworkAvailabilityChangedEventHandler)
                    Dim context As ExecutionContext = DirectCast(array(i).Value, ExecutionContext)
                    If (context Is Nothing) Then
                        key.Invoke(Nothing, New NetworkAvailabilityEventArgs(AvailabilityChangeListener.isAvailable))
                    Else
                        ExecutionContext.Run(context.CreateCopy, AvailabilityChangeListener.s_RunHandlerCallback, key)
                    End If
                Next i
            End If
        End SyncLock
    End Sub
    

    根据这些看来,如果它告诉你有网络,它也应该告诉你没有网络。它似乎也适用于每个设备的地址。当地址发生变化时,它会调用 ChangedAddress。

    看看这些,看看你是否更清楚地了解幕后发生的事情。

    【讨论】:

    • 感谢这篇文章,代码很好而且很清晰,但正如我所见,它需要一些本机调用并且没有问题,因为我已经通过使用互操作以类似的方式解决了这个问题使用 SENS 架构和 COM+ 事件系统,奇怪的是我在经过一些测试后谈到的 .NET 功能,似乎只有在应用程序运行时已连接时才能与调制解调器一起使用,然后它会检测到断开连接,但是如果您再次连接并断开连接。它不会.. !!!但在 LAN 上工作得很好,有一些延迟,无论如何,再次感谢 AB
    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多