static string GetSubnet(string sIP, string sDC) { IntPtr pSiteNames; IntPtr pSubnetNames; SOCKET_ADDRESS[] SocketAddresses = new SOCKET_ADDRESS[1]; String[] ipArray = sIP.Split('.'); if (ipArray.Length < 4) { return(null); } SockAddr_In sockAddr; sockAddr.sin_family = 2; sockAddr.sin_port = 0; sockAddr.sin_addr = new byte[4] { byte.Parse(ipArray[0]), byte.Parse(ipArray[1]), byte.Parse(ipArray[2]), byte.Parse(ipArray[3]) }; sockAddr.sin_zero = new byte[8] { 0, 0, 0, 0, 0, 0, 0, 0 }; SocketAddresses[0].iSockaddrLength = Marshal.SizeOf(sockAddr); IntPtr pSockAddr = Marshal.AllocHGlobal(16); Marshal.StructureToPtr(sockAddr, pSockAddr, true); SocketAddresses[0].lpSockaddr = pSockAddr; if (DsAddressToSiteNamesEx( sDC, 1,//EntryCount SocketAddresses, out pSiteNames, out pSubnetNames) == ERROR_SUCCESS) { string sSite = Marshal.PtrToStringAuto(Marshal.ReadIntPtr(pSiteNames, 0)); string sSubnet = Marshal.PtrToStringAuto(Marshal.ReadIntPtr(pSubnetNames, 0)); NetApiBufferFree(pSubnetNames); NetApiBufferFree(pSiteNames); Console.WriteLine("[GetSubnet] Subnet found: " + sSubnet); Console.WriteLine("[GetSubnet] Site found: " + sSite); return(sSubnet); } else { Console.WriteLine("[GetSubnet] No subnet found!"); return(null); } }
public static System.Net.IPAddress Convert(this SOCKET_ADDRESS sockAddr) { switch ((ADDRESS_FAMILY)Marshal.ReadInt16(sockAddr.lpSockAddr)) { case ADDRESS_FAMILY.AF_INET: return(new System.Net.IPAddress((long)sockAddr.lpSockAddr.ToStructure <SOCKADDR_IN>().sin_addr)); case ADDRESS_FAMILY.AF_INET6: return(new System.Net.IPAddress(sockAddr.lpSockAddr.ToStructure <SOCKADDR_IN6>().sin6_addr)); default: throw new Exception("Non-IP address family"); } }