public InterfaceAddress[] GetInterfaceAddresses() { List <InterfaceAddress> result = new List <InterfaceAddress>(); IntPtr ifap; if (getifaddrs(out ifap) != 0) { throw new SystemException("getifaddrs() failed"); } try { IntPtr next = ifap; while (next != IntPtr.Zero) { ifaddrs addr = (ifaddrs)Marshal.PtrToStructure(next, typeof(ifaddrs)); string name = addr.ifa_name; if (addr.ifa_addr != IntPtr.Zero) { int index = if_nametoindex(name); sockaddr_in sockaddr = (sockaddr_in)Marshal.PtrToStructure(addr.ifa_addr, typeof(sockaddr_in)); if (sockaddr.sin_family == AF_INET6) { sockaddr_in6 nmask = (sockaddr_in6)Marshal.PtrToStructure(addr.ifa_netmask, typeof(sockaddr_in6)); int prefixLength = GetIPv6PrefixLength(nmask.sin6_addr.u6_addr8); sockaddr_in6 sockaddr6 = (sockaddr_in6)Marshal.PtrToStructure(addr.ifa_addr, typeof(sockaddr_in6)); IPAddress address = new IPAddress(sockaddr6.sin6_addr.u6_addr8, sockaddr6.sin6_scope_id); InterfaceAddress info = new InterfaceAddress(index, name, address, prefixLength); result.Add(info); } else if (sockaddr.sin_family == AF_INET) { sockaddr_in netmaskaddr = (sockaddr_in)Marshal.PtrToStructure(addr.ifa_netmask, typeof(sockaddr_in)); IPAddress netmask = new IPAddress(netmaskaddr.in_addr); IPAddress address = new IPAddress(sockaddr.in_addr); InterfaceAddress info = new InterfaceAddress(index, name, address, netmask); result.Add(info); } } next = addr.ifa_next; } } finally { freeifaddrs(ifap); } return(result.ToArray()); }
public InterfaceAddress[] GetInterfaceAddresses() { IntPtr ifap; if (getifaddrs(out ifap) != 0) { throw new SystemException("getifaddrs() failed"); } List<InterfaceAddress> result = new List<InterfaceAddress>(); try { IntPtr next = ifap; while (next != IntPtr.Zero) { ifaddrs addr = (ifaddrs) Marshal.PtrToStructure(next, typeof(ifaddrs)); string name = addr.ifa_name; if (addr.ifa_addr != IntPtr.Zero) { sockaddr_in sockaddr = (sockaddr_in) Marshal.PtrToStructure(addr.ifa_addr, typeof(sockaddr_in)); int index = if_nametoindex(name); if (sockaddr.sin_family == AF_INET6) { sockaddr_in6 sockaddr6 = (sockaddr_in6) Marshal.PtrToStructure(addr.ifa_addr, typeof(sockaddr_in6)); IPAddress address = new IPAddress(sockaddr6.sin6_addr.u6_addr8, sockaddr6.sin6_scope_id); InterfaceAddress info = new InterfaceAddress(index, name, address, GetPrefixLength(name, address)); result.Add(info); } else if (sockaddr.sin_family == AF_INET) { sockaddr_in netmaskaddr = (sockaddr_in)Marshal.PtrToStructure(addr.ifa_netmask, typeof(sockaddr_in)); IPAddress netmask = new IPAddress(netmaskaddr.sin_addr); IPAddress address = new IPAddress(sockaddr.sin_addr); InterfaceAddress info = new InterfaceAddress(index, name, address, netmask); result.Add(info); } } next = addr.ifa_next; } } finally { freeifaddrs(ifap); } return result.ToArray(); }