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();
        }
Beispiel #2
0
        internal static SockAddr ToSockAddr(this IPEndPoint endPoint)
        {
            var sockAddrIn = new SockAddrIn();

            sockAddrIn.sin_family = IO.AF_INET;
            sockAddrIn.sin_port   = (ushort)IPAddress.HostToNetworkOrder((short)endPoint.Port);
            IO.Inet_pton(IO.AF_INET, endPoint.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);
            return(sockAddr);
        }