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