예제 #1
0
        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);
        }
예제 #2
0
        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);
        }