public static void SetInterfaceAddress(string interfaceName, string address, bool isMask)
        {
            var ifReq      = new InterfaceRequestWithAddress();
            var sockAddrIn = new SockAddrIn();

            sockAddrIn.sin_family = IO.AF_INET;
            IO.Inet_pton(IO.AF_INET, address.ToString(), ref sockAddrIn.sin_addr);
            IntPtr sockAddrInPtr = Marshal.AllocHGlobal(Marshal.SizeOf(sockAddrIn));

            Marshal.StructureToPtr(sockAddrIn, sockAddrInPtr, true);
            var sockAddr = Marshal.PtrToStructure <SockAddr>(sockAddrInPtr);

            Marshal.FreeHGlobal(sockAddrInPtr);
            ifReq.ifrn_name = interfaceName;
            ifReq.if_addr   = sockAddr;
            using var socketFileDescriptor = IO.Socket(IO.AF_INET, IO.SOCK_DGRAM, IO.IPPROTO_IP);
            var request = isMask ? IO.SIOCSIFNETMASK : IO.SIOCSIFADDR;

            // Remove IPv6 address
            IO.IOCtl(socketFileDescriptor, request, ref ifReq);
            var p = new Process();

            p.StartInfo = new ProcessStartInfo
            {
                UseShellExecute        = false,
                RedirectStandardOutput = true,
                FileName  = "ip",
                Arguments = $"-6 addr flush {interfaceName}"
            };
            p.Start();
        }
        public static IPAddress GetInterfaceAddress(string interfaceName)
        {
            var ifReq = new InterfaceRequestWithAddress();

            ifReq.ifrn_name = interfaceName;
            using var socketFileDescriptor = IO.Socket(IO.AF_INET, IO.SOCK_DGRAM, IO.IPPROTO_IP);
            IO.IOCtl(socketFileDescriptor, IO.SIOCGIFADDR, ref ifReq);
            var addressBytes = Enumerable.Range(2, 4).Select(i => ifReq.if_addr.sa_data[i]).ToArray();

            return(new IPAddress(addressBytes));
        }
Exemple #3
0
 internal static extern int IOCtl(FileDescriptor fd, uint request, ref InterfaceRequestWithAddress data);