2010-09-10 4 views
3

Я создаю простое приложение, которое прослушивает NetworkAvailibilityChanged Событие. Все хорошо, за исключением случая подключения модема к PPP-интерфейсу, когда приложение получает уведомление о доступности только при подключении сети, но не при отключении.Проверить подключение к сети

Я ничего не пропустил? Я попробовал его для локальной сети, и он работал отлично.

ответ

3

Вот что касается связей 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.

Посмотрите на них и посмотрите, не поняли ли вы, что происходит за кулисами.

+0

Thanx для сообщения, код хороший и понятный, но, как я вижу, для этого требуются некоторые нативные вызовы, и с этим нет проблем, потому что я решил проблему аналогичным образом, используя взаимодействие с архитектурой SENS и система событий COM +, странно, что функция .NET, о которой я говорил после некоторого тестирования, по-видимому, работал с модемом, только если вы подключены в момент запуска приложения, то он обнаруживает отключение, но если u снова подключиться и отключиться. это не будет .. !!! но отлично работает с LAN с некоторой задержкой, так или иначе, AB –

Смежные вопросы