public static IList <AdapterInfo> getIPAddresses() { var adapters = new List <AdapterInfo>(); uint outBufLen = 0; ERROR err = (ERROR)Sockets.SocketsApi.GetAdapterAddresses(AddressFamily.InterNetwork, (uint)0, IntPtr.Zero, ref outBufLen); if (ERROR.ERROR_BUFFER_OVERFLOW == err) { byte[] buffer = new byte[outBufLen]; var bufferHandle = Microsoft.Phone.InteropServices.GCHandle.Alloc(buffer, GCHandleType.Pinned); IntPtr pAdapterAddresses = bufferHandle.AddrOfPinnedObject(); try { err = (ERROR)Sockets.SocketsApi.GetAdapterAddresses(AddressFamily.InterNetwork, (uint)0, pAdapterAddresses, ref outBufLen); if (ERROR.ERROR_SUCCESS == err) { IntPtr currPtr = pAdapterAddresses; while (IntPtr.Zero != currPtr) { IP_ADAPTER_ADDRESSES addr = (IP_ADAPTER_ADDRESSES)Microsoft.Phone.InteropServices.Marshal.PtrToStructure(currPtr, typeof(IP_ADAPTER_ADDRESSES)); AdapterInfo ainfo = new AdapterInfo(); ainfo.FriendlyName = addr.FriendlyName; ainfo.Description = addr.Description; if (IntPtr.Zero != addr.FirstUnicastAddress) { IP_ADAPTER_UNICAST_ADDRESS unicastAddr = (IP_ADAPTER_UNICAST_ADDRESS)Microsoft.Phone.InteropServices.Marshal.PtrToStructure(addr.FirstUnicastAddress, typeof(IP_ADAPTER_UNICAST_ADDRESS)); if (IntPtr.Zero != unicastAddr.Address.lpSockAddr) { // TODO check ipv4 and ipv6 SOCKADDR socketAddr = (SOCKADDR)Microsoft.Phone.InteropServices.Marshal.PtrToStructure(unicastAddr.Address.lpSockAddr, typeof(SOCKADDR)); byte[] saData = socketAddr.sa_data; // skip take IPAddress ipAddr = new IPAddress(GetBytes(saData)); ainfo.Address = ipAddr; } } adapters.Add(ainfo); currPtr = addr.Next; } } } finally { bufferHandle.Free(); } } return(adapters); }
public static IList <IPAddress> GetIPAddresses(FAMILY family) { List <IPAddress> addresses = new List <IPAddress>(); foreach (IP_ADAPTER_ADDRESSES addr in GetIPAdapters(family)) { if (IntPtr.Zero != addr.FirstUnicastAddress) { IP_ADAPTER_UNICAST_ADDRESS unicastAddr = (IP_ADAPTER_UNICAST_ADDRESS)Marshal.PtrToStructure(addr.FirstUnicastAddress, typeof(IP_ADAPTER_UNICAST_ADDRESS)); if (IntPtr.Zero != unicastAddr.Address.lpSockAddr) { SOCKADDR socketAddr = (SOCKADDR)Marshal.PtrToStructure(unicastAddr.Address.lpSockAddr, typeof(SOCKADDR)); byte[] saData = socketAddr.sa_data.Skip(2).Take(4).ToArray(); IPAddress ipAddr = new IPAddress(saData); addresses.Add(ipAddr); } } } return(addresses); }