コード例 #1
0
        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());
        }
コード例 #2
0
ファイル: Linux.cs プロジェクト: codebutler/meshwork
        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();
        }