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)); }
internal static extern int IOCtl(FileDescriptor fd, uint request, ref InterfaceRequestWithAddress data);