2009-05-23 8 views
1

Ce qui suit est une section de code qui construit une liste d'adresses IP et leurs masques de sous-réseau du système local, mais la fonction Warn semble se déclencher régulièrement, ce qui devrait théoriquement être impossible - car il ne devrait pas être possible Adresse IPv4 sans le masque de sous-réseau associé [?].Pourquoi UnicastIPAddressInformation.IPv4Mask renvoie null sur une adresse IPv4?

static NetworkUtil() 
    { 
     foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      foreach (UnicastIPAddressInformation address in ni.GetIPProperties().UnicastAddresses) 
      { 
       if (address.Address.AddressFamily == AddressFamily.InterNetwork) 
       { 
        if (address.IPv4Mask != null) 
        { 
         m_subnets.Add(address.Address, address.IPv4Mask); 
        } 
        else 
        { 
         m_log.Warn("[NetworkUtil] Found IPv4 Address without Subnet Mask!?"); 
        } 
       } 
      } 
     } 
    } 

Répondre

0

Ceci est plutôt étrange; évidemment, la sémantique de ceci n'est pas tout à fait ce à quoi on pourrait raisonnablement s'attendre.

Pouvez-vous vérifier si les masques de sous-réseau des interfaces en question sont classful? C'est-à-dire, pour les adresses d'interface où IPv4Mask est nul, sont-elles des adresses de classe A, B et C avec un masque de réseau de/8,/16 et/24 respectivement?

Peut-être que cette fonction n'est pas vraiment un membre du monde CIDR, et ils le font en réalité que des masques « de sous-réseau »; une adresse sans un est supposée utiliser le masque réseau classful.

1

C'est parce que vous avez rencontré un adaptateur de boucle. Par exemple, 127.0.0.1 Le masque IPv4 est défini sur null. Reportez-vous à ni.Name pour voir si j'ai raison.

Pour vérifier un adaptateur ... réalimentation faire

si (ni.NetworkInterfaceType! = NetworkInterfaceType.Loopback) ...

1

IPv4Mask retourne null lorsque le réseau est en panne (voir ni.OperationalStatus) , que vous rencontrerez souvent lors de l'itération de tout ce que GetAllNetworkInterfaces() renvoie.

Cela semble avoir été fixé en .Net 4.0

Parfois, les masques peuvent être déduites, par exemple toutes les adresses IP qui commencent par 169.254 (qui est ce que Windows choisira lorsque DHCP échoue) ont un masque de 255.255.0.0

0

Une raison pour laquelle je suis venu juste en face:

J'utilise NET Framework 4 profil client , IPv4Mask a bien fonctionné avec moi. Lors du passage à .NET Framework 2 ou 3.5, il renvoyait NULL. J'ai reproduit le problème plusieurs fois.

Questions connexes