【发布时间】:2010-09-10 18:03:13
【问题描述】:
我正在构建一个简单的应用程序来监听NetworkAvailibilityChanged 事件。一切都很好,除了调制解调器 PPP 接口连接,应用程序仅在网络连接时才收到可用性通知,而在断开连接时不会收到通知。
我错过了什么吗?我在局域网上试了一下,效果很好。
【问题讨论】:
标签: c# .net networking
我正在构建一个简单的应用程序来监听NetworkAvailibilityChanged 事件。一切都很好,除了调制解调器 PPP 接口连接,应用程序仅在网络连接时才收到可用性通知,而在断开连接时不会收到通知。
我错过了什么吗?我在局域网上试了一下,效果很好。
【问题讨论】:
标签: c# .net networking
这是 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。
看看这些,看看你是否更清楚地了解幕后发生的事情。
【讨论】: