Примечание. Мне известно и хорошо известно, что такое NullReferenceException
есть, а как отлаживать и находить откуда - тут не в этом вопрос
Моя цель: для проекта в Unity3D я пытаюсь найти все сетевые интерфейсы моего устройства и сохранить их IpAddress
es в списке для последующего использования. Позже я передам сообщение обо всех них.
Я следил за Как мне получить сеть интерфейс и его правильный IPv4-адрес? и Broadcasting UDP сообщение всем доступным сетевым картам (в частности, этот ответ) и попытался придумать следующий:
var addresses = new List<IPAddress>();
var allNetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (var networkInterface in allNetworkInterfaces)
{
if (networkInterface.OperationalStatus != OperationalStatus.Up) continue;
if (networkInterface.NetworkInterfaceType != NetworkInterfaceType.Wireless80211 && networkInterface.NetworkInterfaceType != NetworkInterfaceType.Ethernet)continue;
if (!networkInterface.SupportsMulticast) continue;
if (networkInterface.Supports(NetworkInterfaceComponent.IPv4) == false) continue;
var ipProperties = networkInterface.GetIPProperties();
if (ipProperties == null) continue;
var ipv4Properties = ipProperties.GetIPv4Properties(); // !! EXCEPTION IS THROWN HERE !!
if (ipv4Properties == null) continue;
if (NetworkInterface.LoopbackInterfaceIndex == ipv4Properties.Index) continue;
var unicastAddresses = ipProperties.UnicastAddresses;
foreach (var unicastIpAddressInformation in unicastAddresses)
{
if (unicastIpAddressInformation.Address.AddressFamily != AddressFamily.InterNetwork) continue;
addresses.Add(unicastIpAddressInformation.Address);
}
}
// and yes I used Linq before but I converted it to the loop due to debug the exception ^^
Исключение
System.NullReferenceException: ссылка на объект не указывает на экземпляр объекта
в (оболочка, управляемая в собственный) System.Net.NetworkInformation.Win32IPv4InterfaceProperties.GetPerAdapterInfo(int,System.Net.NetworkInformation.Win32_IP_PER_ADAPTER_INFO,int&)
at System.Net.NetworkInformation.Win32IPv4InterfaceProperties..ctor (System.Net.NetworkInformation.Win32_IP_ADAPTER_ADDRESSES addr, System.Net.NetworkInformation.Win32_MIB_IFROW mib) [0x00030] в ‹14e3453b740b4bd690e8d4ebr>NetworkInformat.5a013a715 Win32IPInterfaceProperties2.GetIPv4Properties () [0x00000] в ‹14e3453b740b4bd690e8d4e5a013a715›:0
в Broadcast.BroadCastTest (System.UInt16 BroadcastPort, клиент System.Net.Sockets.UdpClient) [0x000ae] в C:\cxxxs\79cast.Broadcast.
бросается в
var ipv4Properties = ipProperties.GetIPv4Properties();
где ipProperties
не null
, так что очевидно, что это откуда-то внутри GetIPv4Properties
. Единственным возможным исключением, перечисленным в API, будет NetworkInformationException
, но не NullReferenceException
.
Также, прежде чем я проверил и уже убедился, что
networkInterface.Supports(NetworkInterfaceComponent.IPv4)
true
(это мой интерфейс Ethernet, так что это явно интерфейс IPv4).
Почему возникает исключение и как его решить?
Я делаю что-то глупое? ^^
Обновлять
По принципу исправлю закомментировав пока просто пропущу проверку loopBack
// var ipv4Properties = ipProperties.GetIPv4Properties();
// if (ipv4Properties == null) continue;
// if (NetworkInterface.LoopbackInterfaceIndex == ipv4Properties.Index) continue;
Поскольку afaik петля уже должна быть покрыта, так как
networkInterface.NetworkInterfaceType != NetworkInterfaceType.Loopback