Beispiel #1
0
        public IDictionary <string, string> GetIPAddresses()
        {
            var netInterfaceInfos = new Dictionary <string, NetInterfaceInfo>();

            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));

                    if (addr.ifa_addr != IntPtr.Zero && (((IFF)addr.ifa_flags & IFF.UP) != 0) && ((((IFF)addr.ifa_flags) & IFF.LOOPBACK) == 0))
                    {
                        byte sa_family = ((sockaddr)Marshal.PtrToStructure(addr.ifa_addr, typeof(sockaddr))).sa_family;

                        NetInterfaceInfo info;

                        if (!(netInterfaceInfos.TryGetValue(addr.ifa_name, out info)))
                        {
                            info = new NetInterfaceInfo();
                            netInterfaceInfos.Add(addr.ifa_name, info);
                        }

                        if (sa_family == AF_INET || sa_family == AF_INET6)
                        {
                            info.Netmask = new IPAddress(((sockaddr_in)Marshal.PtrToStructure(addr.ifa_netmask, typeof(sockaddr_in))).sin_addr);
                            info.Address = new IPAddress(((sockaddr_in)Marshal.PtrToStructure(addr.ifa_addr, typeof(sockaddr_in))).sin_addr);
                        }
                        else if (sa_family == AF_LINK)
                        {
                            sockaddr_dl sockaddrdl = new sockaddr_dl();
                            sockaddrdl.Read(addr.ifa_addr);

                            info.MacAddress = new byte [(int)sockaddrdl.sdl_alen];
                            Array.Copy(sockaddrdl.sdl_data, sockaddrdl.sdl_nlen, info.MacAddress, 0, Math.Min(info.MacAddress.Length, sockaddrdl.sdl_data.Length - sockaddrdl.sdl_nlen));
                            info.Index = sockaddrdl.sdl_index;
                            info.Type  = sockaddrdl.sdl_type;
                        }
                    }
                    next = addr.ifa_next;
                }
            }
            finally
            {
                freeifaddrs(ifap);
            }

            return(netInterfaceInfos.ToDictionary(x => x.Key, x => x.Value.Address.ToString()));
        }
        public static NetworkInterface[] ImplGetAllNetworkInterfaces()
        {
            Dictionary <string, MacOsNetworkInterface> dictionary = new Dictionary <string, MacOsNetworkInterface>();
            IntPtr intPtr;

            if (MacOsNetworkInterface.getifaddrs(out intPtr) != 0)
            {
                throw new SystemException("getifaddrs() failed");
            }
            try
            {
                IntPtr intPtr2 = intPtr;
                while (intPtr2 != IntPtr.Zero)
                {
                    ifaddrs              ifaddrs              = (ifaddrs)Marshal.PtrToStructure(intPtr2, typeof(ifaddrs));
                    IPAddress            ipaddress            = IPAddress.None;
                    string               ifa_name             = ifaddrs.ifa_name;
                    int                  index                = -1;
                    byte[]               array                = null;
                    NetworkInterfaceType networkInterfaceType = NetworkInterfaceType.Unknown;
                    if (ifaddrs.ifa_addr != IntPtr.Zero)
                    {
                        sockaddr sockaddr = (sockaddr)Marshal.PtrToStructure(ifaddrs.ifa_addr, typeof(sockaddr));
                        if (sockaddr.sa_family == 30)
                        {
                            sockaddr_in6 sockaddr_in = (sockaddr_in6)Marshal.PtrToStructure(ifaddrs.ifa_addr, typeof(sockaddr_in6));
                            ipaddress = new IPAddress(sockaddr_in.sin6_addr.u6_addr8, (long)((ulong)sockaddr_in.sin6_scope_id));
                        }
                        else if (sockaddr.sa_family == 2)
                        {
                            ipaddress = new IPAddress((long)((ulong)((sockaddr_in)Marshal.PtrToStructure(ifaddrs.ifa_addr, typeof(sockaddr_in))).sin_addr));
                        }
                        else if (sockaddr.sa_family == 18)
                        {
                            sockaddr_dl sockaddr_dl = (sockaddr_dl)Marshal.PtrToStructure(ifaddrs.ifa_addr, typeof(sockaddr_dl));
                            array = new byte[(int)sockaddr_dl.sdl_alen];
                            Array.Copy(sockaddr_dl.sdl_data, (int)sockaddr_dl.sdl_nlen, array, 0, Math.Min(array.Length, sockaddr_dl.sdl_data.Length - (int)sockaddr_dl.sdl_nlen));
                            index = (int)sockaddr_dl.sdl_index;
                            int sdl_type = (int)sockaddr_dl.sdl_type;
                            if (Enum.IsDefined(typeof(MacOsArpHardware), sdl_type))
                            {
                                MacOsArpHardware macOsArpHardware = (MacOsArpHardware)sdl_type;
                                switch (macOsArpHardware)
                                {
                                case MacOsArpHardware.PPP:
                                    networkInterfaceType = NetworkInterfaceType.Ppp;
                                    break;

                                case MacOsArpHardware.LOOPBACK:
                                    networkInterfaceType = NetworkInterfaceType.Loopback;
                                    array = null;
                                    break;

                                default:
                                    if (macOsArpHardware != MacOsArpHardware.ETHER)
                                    {
                                        if (macOsArpHardware != MacOsArpHardware.FDDI)
                                        {
                                            if (macOsArpHardware == MacOsArpHardware.ATM)
                                            {
                                                networkInterfaceType = NetworkInterfaceType.Atm;
                                            }
                                        }
                                        else
                                        {
                                            networkInterfaceType = NetworkInterfaceType.Fddi;
                                        }
                                    }
                                    else
                                    {
                                        networkInterfaceType = NetworkInterfaceType.Ethernet;
                                    }
                                    break;

                                case MacOsArpHardware.SLIP:
                                    networkInterfaceType = NetworkInterfaceType.Slip;
                                    break;
                                }
                            }
                        }
                    }
                    MacOsNetworkInterface macOsNetworkInterface = null;
                    if (!dictionary.TryGetValue(ifa_name, out macOsNetworkInterface))
                    {
                        macOsNetworkInterface = new MacOsNetworkInterface(ifa_name);
                        dictionary.Add(ifa_name, macOsNetworkInterface);
                    }
                    if (!ipaddress.Equals(IPAddress.None))
                    {
                        macOsNetworkInterface.AddAddress(ipaddress);
                    }
                    if (array != null || networkInterfaceType == NetworkInterfaceType.Loopback)
                    {
                        macOsNetworkInterface.SetLinkLayerInfo(index, array, networkInterfaceType);
                    }
                    intPtr2 = ifaddrs.ifa_next;
                }
            }
            finally
            {
                MacOsNetworkInterface.freeifaddrs(intPtr);
            }
            NetworkInterface[] array2 = new NetworkInterface[dictionary.Count];
            int num = 0;

            foreach (NetworkInterface networkInterface in dictionary.Values)
            {
                array2[num] = networkInterface;
                num++;
            }
            return(array2);
        }