如何获取运行我的C#应用程序的服务器的IP地址?
我正在运行一个服务器,我想显示我自己的IP地址。
获取计算机自己(如果可能的话,外部)IP地址的语法是什么?
有人写了下面的代码。
IPHostEntry host; string localIP = "?"; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily.ToString() == "InterNetwork") { localIP = ip.ToString(); } } return localIP;
但是,我一般不相信作者,而且我也不懂这个代码。 有没有更好的方法来做到这一点?
不,那几乎是最好的办法。 作为一台机器可以有多个IP地址,你需要迭代它们的集合来find合适的IP地址。
编辑:我会改变的唯一的事情就是改变这一点:
if (ip.AddressFamily.ToString() == "InterNetwork")
对此:
if (ip.AddressFamily == AddressFamily.InterNetwork)
没有必要ToString
一个枚举比较。
知道你的公有知识产权的唯一方法就是要求别人告诉你。 此代码可以帮助您:
public string GetPublicIP() { String direction = ""; WebRequest request = WebRequest.Create("http://checkip.dyndns.org/"); using (WebResponse response = request.GetResponse()) using (StreamReader stream = new StreamReader(response.GetResponseStream())) { direction = stream.ReadToEnd(); } //Search for the ip in the html int first = direction.IndexOf("Address: ") + 9; int last = direction.LastIndexOf("</body>"); direction = direction.Substring(first, last - first); return direction; }
清洁和一个一个解决scheme:D
//This returns the first IP4 address or null return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
如果您不能依靠从DNS服务器获取您的IP地址(发生在我身上),您可以使用以下方法:
System.Net.NetworkInformation命名空间包含一个NetworkInterface类 ,它有一个静态GetAllNetworkInterfaces方法 。
此方法将返回您计算机上的所有“networking接口”,即使您的计算机上只安装了无线适配器和/或以太网适配器硬件,也通常会有这种情况。 所有这些networking接口都有本地机器的有效IP地址,尽pipe你可能只需要一个。
如果您正在查找一个IP地址,则需要过滤列表,直到find正确的地址。 你可能需要做一些实验,但是我用以下方法取得了成功:
- 通过检查
OperationalStatus == OperationalStatus.Up
过滤掉任何不活动的NetworkInterface。 这将排除您的物理以太网适配器,例如,如果您没有插入networking电缆。
对于每个NetworkInterface,可以使用GetIPProperties方法获取IPInterfaceProperties对象,并且可以从IPInterfaceProperties对象访问UnicastAddresses属性以获取UnicastIPAddressInformation对象的列表。
- 通过检查
DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
过滤掉非首选的单播地址 - 通过检查
AddressPreferredLifetime != UInt32.MaxValue
过滤掉“虚拟”地址。
在这一点上,我把第一个(如果有的话)单播地址的地址与所有这些filter匹配。
编辑:
public static IEnumerable<IPAddress> GetLocalIpAddresses() { // Get the list of network interfaces for the local computer. var adapters = NetworkInterface.GetAllNetworkInterfaces(); // Return the list of local IPv4 addresses excluding the local // host and disconnected addresses. return (from adapter in adapters let properties = adapter.GetIPProperties() where adapter.OperationalStatus == OperationalStatus.Up && properties.UnicastAddresses.Count > 0 && properties.UnicastAddresses.First().Address.AddressFamily == AddressFamily.InterNetwork && !properties.UnicastAddresses.First().Address.Equals(IPAddress.Loopback) select properties.UnicastAddresses.First().Address).ToList(); }
WebClient webClient = new WebClient(); string IP = webClient.DownloadString("http://myip.ozymo.com/");
using System.Net; string host = Dns.GetHostName(); IPHostEntry ip = Dns.GetHostEntry(host); Console.WriteLine(ip.AddressList[0].ToString());
只是在我的机器上testing过,它工作。
如果你想避免使用DNS
List<IPAddress> ipList = new List<IPAddress>(); foreach (var ni in NetworkInterface.GetAllNetworkInterfaces()) { foreach (var ua in ni.GetIPProperties().UnicastAddresses) { if (ua.Address.AddressFamily == AddressFamily.InterNetwork) { Console.WriteLine("found ip " + ua.Address.ToString()); ipList.Add(ua.Address); } } }
不要一直依赖InterNetwork,因为您可以拥有多台也使用IP4的设备,从而导致获取IP的结果。 现在,如果你愿意,你可以复制这个,请检查它,或更新它,以适应你的看法。
首先我得到路由器(网关)的地址如果它回来,我连接到一个网关(这意味着没有直接连接到调制解调器无线或不),那么我们有我们的网关地址作为IP地址,否则我们一个空指针IP地址参考。
然后我们需要获得计算机的IP地址列表。 这是事情并不难,因为路由器(所有路由器)使用4个字节(…)。 前三个是最重要的,因为连接到它的任何计算机将具有匹配前三个字节的IP4地址。 例如:192.168.0.1是路由器默认IP的标准,除非由pipe理员更改。 '192.168.0'或者任何他们可能是我们需要匹配的东西。 这就是我在IsAddressOfGateway函数中所做的。 长度匹配的原因是因为并非所有地址(仅用于计算机)的长度都是4字节。 如果你在cmd中inputnetstat,你会发现这是真的。 所以你有它。 是的,需要多一点工作才能真正得到你要找的东西。 排除法。 看在上帝的份上,不要通过ping地址来find地址,这需要花费时间,因为首先你要发送的地址被ping,然后把结果发送回去。 不,直接使用.Net类来处理你的系统环境,当你需要单独使用你的计算机时,你将得到你正在寻找的答案。
现在,如果你是直接连接到你的调制解调器,进程是几乎相同的,因为调制解调器是你的网关,但子掩码是不一样的,因为你通过调制解调器直接从您的DNS服务器获取信息,而不是由服务器互联网给你,虽然你仍然可以使用相同的代码,因为分配给调制解调器的IP的最后一个字节是1.所以如果从调制解调器发送的IP改变是111.111.111.1'那么你将得到111.111.111。字节值)。 请记住,我们需要find网关信息,因为与路由器和调制解调器相比,处理互联网连接的设备更多。
现在你明白了为什么你不改变你的路由器的前两个字节192和168.这些是严格区分路由器而不是互联网使用,否则我们将有一个严重的问题与IP协议和双重ping导致您的计算机崩溃。 图像,您分配的路由器IP是192.168.44.103,你点击一个网站与该IP以及。 我的天啊! 你的电脑不知道该ping什么。 就在那里 为了避免这个问题,只有路由器被分配这些,而不是因特网使用。 因此,请保留路由器的前两个字节。
static IPAddress FindLanAddress() { IPAddress gateway = FindGetGatewayAddress(); if (gateway == null) return null; IPAddress[] pIPAddress = Dns.GetHostAddresses(Dns.GetHostName()); foreach (IPAddress address in pIPAddress) { if (IsAddressOfGateway(address, gateway)) return address; return null; } static bool IsAddressOfGateway(IPAddress address, IPAddress gateway) { if (address != null && gateway != null) return IsAddressOfGateway(address.GetAddressBytes(),gateway.GetAddressBytes()); return false; } static bool IsAddressOfGateway(byte[] address, byte[] gateway) { if (address != null && gateway != null) { int gwLen = gateway.Length; if (gwLen > 0) { if (address.Length == gateway.Length) { --gwLen; int counter = 0; for (int i = 0; i < gwLen; i++) { if (address[i] == gateway[i]) ++counter; } return (counter == gwLen); } } } return false; } static IPAddress FindGetGatewayAddress() { IPGlobalProperties ipGlobProps = IPGlobalProperties.GetIPGlobalProperties(); foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) { IPInterfaceProperties ipInfProps = ni.GetIPProperties(); foreach (GatewayIPAddressInformation gi in ipInfProps.GatewayAddresses) return gi.Address; } return null; }
我只是想,我会添加自己的,一行(即使已经有很多其他有用的答案)。
string ipAddress = new WebClient().DownloadString("http://icanhazip.com");
为了获取当前的公共IP地址,您只需要在页面加载事件中使用以下行创build一个ASPX页面:
Response.Write(HttpContext.Current.Request.UserHostAddress.ToString());
如果你在intranet上运行,你将能够得到本地的机器IP地址,如果没有,你会得到这个外部IP地址:Web:
//this will bring the IP for the current machine on browser System.Web.HttpContext.Current.Request.UserHostAddress
桌面:
//This one will bring all local IPs for the desired namespace IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
namespace NKUtilities { using System; using System.Net; using System.Net.Sockets; public class DNSUtility { public static int Main(string [] args) { string strHostName = ""; try { if(args.Length == 0) { // Getting Ip address of local machine... // First get the host name of local machine. strHostName = Dns.GetHostName(); Console.WriteLine ("Local Machine's Host Name: " + strHostName); } else { // Otherwise, get the IP address of the host provided on the command line. strHostName = args[0]; } // Then using host name, get the IP address list.. IPHostEntry ipEntry = Dns.GetHostEntry (strHostName); IPAddress [] addr = ipEntry.AddressList; for(int i = 0; i < addr.Length; i++) { Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString()); } return 0; } catch(SocketException se) { Console.WriteLine("{0} ({1})", se.Message, strHostName); return -1; } catch(Exception ex) { Console.WriteLine("Error: {0}.", ex.Message); return -1; } } } }
看这里的细节。
你必须记住你的计算机可以有多个IP(实际上它总是) – 那么你以后哪一个。
尝试这个:
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); String MyIp = localIPs[0].ToString();
也许通过外部的 IP你可以考虑(如果你在一个Web服务器上下文)使用这个
Request.ServerVariables["LOCAL_ADDR"];
我问你同样的问题,我发现它在这个 stackoverflow文章。
它为我工作。
namespace NKUtilities { using System; using System.Net; public class DNSUtility { public static int Main (string [] args) { String strHostName = new String (""); if (args.Length == 0) { // Getting Ip address of local machine... // First get the host name of local machine. strHostName = Dns.GetHostName (); Console.WriteLine ("Local Machine's Host Name: " + strHostName); } else { strHostName = args[0]; } // Then using host name, get the IP address list.. IPHostEntry ipEntry = DNS.GetHostByName (strHostName); IPAddress [] addr = ipEntry.AddressList; for (int i = 0; i < addr.Length; i++) { Console.WriteLine ("IP Address {0}: {1} ", i, addr[i].ToString ()); } return 0; } } }
using System; using System.Net; namespace IPADDRESS { class Program { static void Main(string[] args) { String strHostName = string.Empty; if (args.Length == 0) { /* First get the host name of local machine.*/ strHostName = Dns.GetHostName(); Console.WriteLine("Local Machine's Host Name: " + strHostName); } else { strHostName = args[0]; } /* Then using host name, get the IP address list..*/ IPHostEntry ipEntry = Dns.GetHostByName(strHostName); IPAddress[] addr = ipEntry.AddressList; for (int i = 0; i < addr.Length; i++) { Console.WriteLine("IP Address {0}: {1} ", i, addr[i].ToString()); } Console.ReadLine(); } } }
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork);
返回第一个内部IPV4地址的简单单行代码,如果没有,则返回null。 作为上面的注释添加,但可能是有用的人(上面的一些解决scheme将返回多个地址,需要进一步过滤)。
返回loopback而不是null我也很容易:
return Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork) ?? new IPAddress( new byte[] {127, 0, 0, 1} );
要查找IP地址列表,我已经使用了这个解决scheme
public static IEnumerable<string> GetAddresses() { var host = Dns.GetHostEntry(Dns.GetHostName()); return (from ip in host.AddressList where ip.AddressFamily == AddressFamily.lo select ip.ToString()).ToList(); }
但我个人喜欢下面的解决scheme来获得本地有效的 IP地址
public static IPAddress GetIPAddress(string hostName) { Ping ping = new Ping(); var replay = ping.Send(hostName); if (replay.Status == IPStatus.Success) { return replay.Address; } return null; } public static void Main() { Console.WriteLine("Local IP Address: " + GetIPAddress(Dns.GetHostName())); Console.WriteLine("Google IP:" + GetIPAddress("google.com"); Console.ReadLine(); }
LINQ解决scheme:
Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).Select(ip => ip.ToString()).FirstOrDefault() ?? ""
这是我如何解决它。 我知道如果你有几个物理接口,这可能不会select你想要的确切的eth。
private string FetchIP() { //Get all IP registered List<string> IPList = new List<string>(); IPHostEntry host; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { IPList.Add(ip.ToString()); } } //Find the first IP which is not only local foreach (string a in IPList) { Ping p = new Ping(); string[] b = a.Split('.'); string ip2 = b[0] + "." + b[1] + "." + b[2] + ".1"; PingReply t = p.Send(ip2); p.Dispose(); if (t.Status == IPStatus.Success && ip2 != a) { return a; } } return null; }
这个问题没有说ASP.NET MVC,但我只是在这里离开这里:
Request.UserHostAddress
使用LINQ获取所有的IP地址作为string:
using System.Linq; using System.Net.NetworkInformation; using System.Net.Sockets; ... string[] allIpAddresses = NetworkInterface.GetAllNetworkInterfaces() .SelectMany(c=>c.GetIPProperties().UnicastAddresses .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork) .Select(d=>d.Address.ToString()) ).ToArray();
过滤私密…
首先定义一个扩展方法IsPrivate()
:
public static class IPAddressExtensions { // Collection of private CIDRs (IpAddress/Mask) private static Tuple<int, int>[] _privateCidrs = new []{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"} .Select(c=>Tuple.Create(BitConverter.ToInt32(IPAddress .Parse(c.Split('/')[0]).GetAddressBytes(), 0) , IPAddress.HostToNetworkOrder(-1 << (32-int.Parse(c.Split('/')[1]))))) .ToArray(); public static bool IsPrivate(this IPAddress ipAddress) { int ip = BitConverter.ToInt32(ipAddress.GetAddressBytes(), 0); return _privateCidrs.Any(cidr=>(ip & cidr.Item2)==(cidr.Item1 & cidr.Item2)); } }
…然后用它来过滤私人IP地址:
string[] publicIpAddresses = NetworkInterface.GetAllNetworkInterfaces() .SelectMany(c=>c.GetIPProperties().UnicastAddresses .Where(d=>d.Address.AddressFamily == AddressFamily.InterNetwork && !d.Address.IsPrivate() // Filter out private ones ) .Select(d=>d.Address.ToString()) ).ToArray();
它适用于我…在大多数情况下(如果不是全部)应该比查询DNS服务器更快。 感谢Wily博士的学徒( 这里 )。
// ************************************************************************ /// <summary> /// Will search for the an active NetworkInterafce that has a Gateway, otherwise /// it will fallback to try from the DNS which is not safe. /// </summary> /// <returns></returns> public static NetworkInterface GetMainNetworkInterface() { List<NetworkInterface> candidates = new List<NetworkInterface>(); if (NetworkInterface.GetIsNetworkAvailable()) { NetworkInterface[] NetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach ( NetworkInterface ni in NetworkInterfaces) { if (ni.OperationalStatus == OperationalStatus.Up) candidates.Add(ni); } } if (candidates.Count == 1) { return candidates[0]; } // Accoring to our tech, the main NetworkInterface should have a Gateway // and it should be the ony one with a gateway. if (candidates.Count > 1) { for (int n = candidates.Count - 1; n >= 0; n--) { if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0) { candidates.RemoveAt(n); } } if (candidates.Count == 1) { return candidates[0]; } } // Fallback to try by getting my ipAdress from the dns IPAddress myMainIpAdress = null; IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4 { myMainIpAdress = ip; break; } } if (myMainIpAdress != null) { NetworkInterface[] NetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface ni in NetworkInterfaces) { if (ni.OperationalStatus == OperationalStatus.Up) { IPInterfaceProperties props = ni.GetIPProperties(); foreach (UnicastIPAddressInformation ai in props.UnicastAddresses) { if (ai.Address.Equals(myMainIpAdress)) { return ni; } } } } } return null; } // ****************************************************************** /// <summary> /// AddressFamily.InterNetwork = IPv4 /// Thanks to Dr. Wilys Apprentice at /// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni /// using System.Net.NetworkInformation; /// </summary> /// <param name="mac"></param> /// <param name="addressFamily">AddressFamily.InterNetwork = IPv4, AddressFamily.InterNetworkV6 = IPv6</param> /// <returns></returns> public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork) { NetworkInterface[] NetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface ni in NetworkInterfaces) { if (ni.GetPhysicalAddress().Equals(mac)) { if (ni.OperationalStatus == OperationalStatus.Up) { IPInterfaceProperties props = ni.GetIPProperties(); foreach (UnicastIPAddressInformation ai in props.UnicastAddresses) { if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred) { if (ai.Address.AddressFamily == addressFamily) { return ai.Address; } } } } } } return null; } // ****************************************************************** /// <summary> /// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call /// '?.ToString() ?? ""' on the result. /// </summary> /// <returns></returns> public static IPAddress GetMyInternetIpAddress() { NetworkInterface ni = GetMainNetworkInterface(); IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress()); if (ipAddress == null) // could it be possible ? { ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6); } return ipAddress; } // ******************************************************************
正如引用这是我定义完整的类代码:
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Threading.Tasks; namespace TcpMonitor { /* Usage: var cons = TcpHelper.GetAllTCPConnections(); foreach (TcpHelper.MIB_TCPROW_OWNER_PID c in cons) ... */ public class NetHelper { [DllImport("iphlpapi.dll", SetLastError = true)] static extern uint GetExtendedUdpTable(IntPtr pUdpTable, ref int dwOutBufLen, bool sort, int ipVersion, UDP_TABLE_CLASS tblClass, uint reserved = 0); public enum UDP_TABLE_CLASS { UDP_TABLE_BASIC, UDP_TABLE_OWNER_PID, UDP_TABLE_OWNER_MODULE } [StructLayout(LayoutKind.Sequential)] public struct MIB_UDPTABLE_OWNER_PID { public uint dwNumEntries; [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)] public MIB_UDPROW_OWNER_PID[] table; } [StructLayout(LayoutKind.Sequential)] public struct MIB_UDPROW_OWNER_PID { public uint localAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] localPort; public uint owningPid; public uint ProcessId { get { return owningPid; } } public IPAddress LocalAddress { get { return new IPAddress(localAddr); } } public ushort LocalPort { get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); } } } [StructLayout(LayoutKind.Sequential)] public struct MIB_UDP6TABLE_OWNER_PID { public uint dwNumEntries; [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)] public MIB_UDP6ROW_OWNER_PID[] table; } [StructLayout(LayoutKind.Sequential)] public struct MIB_UDP6ROW_OWNER_PID { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] localAddr; public uint localScopeId; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] localPort; public uint owningPid; public uint ProcessId { get { return owningPid; } } public IPAddress LocalAddress { get { return new IPAddress(localAddr, localScopeId); } } public ushort LocalPort { get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); } } } public static List<MIB_UDPROW_OWNER_PID> GetAllUDPConnections() { return GetUDPConnections<MIB_UDPROW_OWNER_PID, MIB_UDPTABLE_OWNER_PID> (AF_INET); } public static List<MIB_UDP6ROW_OWNER_PID> GetAllUDPv6Connections() { return GetUDPConnections<MIB_UDP6ROW_OWNER_PID, MIB_UDP6TABLE_OWNER_PID>(AF_INET6); } private static List<IPR> GetUDPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type { List<IPR> result = null; IPR[] tableRows = null; int buffSize = 0; var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries"); // how much memory do we need? uint ret = GetExtendedUdpTable(IntPtr.Zero, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID); IntPtr udpTablePtr = Marshal.AllocHGlobal(buffSize); try { ret = GetExtendedUdpTable(udpTablePtr, ref buffSize, true, ipVersion, UDP_TABLE_CLASS.UDP_TABLE_OWNER_PID); if (ret != 0) return new List<IPR>(); // get the number of entries in the table IPT table = (IPT)Marshal.PtrToStructure(udpTablePtr, typeof(IPT)); int rowStructSize = Marshal.SizeOf(typeof(IPR)); uint numEntries = (uint)dwNumEntriesField.GetValue(table); // buffer we will be returning tableRows = new IPR[numEntries]; IntPtr rowPtr = (IntPtr)((long)udpTablePtr + 4); for (int i = 0; i < numEntries; i++) { IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR)); tableRows[i] = tcpRow; rowPtr = (IntPtr)((long)rowPtr + rowStructSize); // next entry } } finally { result = tableRows?.ToList() ?? new List<IPR>(); // Free the Memory Marshal.FreeHGlobal(udpTablePtr); } return result; } [DllImport("iphlpapi.dll", SetLastError = true)] static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, TCP_TABLE_CLASS tblClass, uint reserved = 0); public enum MIB_TCP_STATE { MIB_TCP_STATE_CLOSED = 1, MIB_TCP_STATE_LISTEN = 2, MIB_TCP_STATE_SYN_SENT = 3, MIB_TCP_STATE_SYN_RCVD = 4, MIB_TCP_STATE_ESTAB = 5, MIB_TCP_STATE_FIN_WAIT1 = 6, MIB_TCP_STATE_FIN_WAIT2 = 7, MIB_TCP_STATE_CLOSE_WAIT = 8, MIB_TCP_STATE_CLOSING = 9, MIB_TCP_STATE_LAST_ACK = 10, MIB_TCP_STATE_TIME_WAIT = 11, MIB_TCP_STATE_DELETE_TCB = 12 } public enum TCP_TABLE_CLASS { TCP_TABLE_BASIC_LISTENER, TCP_TABLE_BASIC_CONNECTIONS, TCP_TABLE_BASIC_ALL, TCP_TABLE_OWNER_PID_LISTENER, TCP_TABLE_OWNER_PID_CONNECTIONS, TCP_TABLE_OWNER_PID_ALL, TCP_TABLE_OWNER_MODULE_LISTENER, TCP_TABLE_OWNER_MODULE_CONNECTIONS, TCP_TABLE_OWNER_MODULE_ALL } [StructLayout(LayoutKind.Sequential)] public struct MIB_TCPTABLE_OWNER_PID { public uint dwNumEntries; [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)] public MIB_TCPROW_OWNER_PID[] table; } [StructLayout(LayoutKind.Sequential)] public struct MIB_TCP6TABLE_OWNER_PID { public uint dwNumEntries; [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 1)] public MIB_TCP6ROW_OWNER_PID[] table; } [StructLayout(LayoutKind.Sequential)] public struct MIB_TCPROW_OWNER_PID { public uint state; public uint localAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] localPort; public uint remoteAddr; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] remotePort; public uint owningPid; public uint ProcessId { get { return owningPid; } } public IPAddress LocalAddress { get { return new IPAddress(localAddr); } } public ushort LocalPort { get { return BitConverter.ToUInt16(new byte[2] { localPort[1], localPort[0] }, 0); } } public IPAddress RemoteAddress { get { return new IPAddress(remoteAddr); } } public ushort RemotePort { get { return BitConverter.ToUInt16(new byte[2] { remotePort[1], remotePort[0] }, 0); } } public MIB_TCP_STATE State { get { return (MIB_TCP_STATE)state; } } } [StructLayout(LayoutKind.Sequential)] public struct MIB_TCP6ROW_OWNER_PID { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] localAddr; public uint localScopeId; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] localPort; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public byte[] remoteAddr; public uint remoteScopeId; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] remotePort; public uint state; public uint owningPid; public uint ProcessId { get { return owningPid; } } public long LocalScopeId { get { return localScopeId; } } public IPAddress LocalAddress { get { return new IPAddress(localAddr, LocalScopeId); } } public ushort LocalPort { get { return BitConverter.ToUInt16(localPort.Take(2).Reverse().ToArray(), 0); } } public long RemoteScopeId { get { return remoteScopeId; } } public IPAddress RemoteAddress { get { return new IPAddress(remoteAddr, RemoteScopeId); } } public ushort RemotePort { get { return BitConverter.ToUInt16(remotePort.Take(2).Reverse().ToArray(), 0); } } public MIB_TCP_STATE State { get { return (MIB_TCP_STATE)state; } } } public const int AF_INET = 2; // IP_v4 = System.Net.Sockets.AddressFamily.InterNetwork public const int AF_INET6 = 23; // IP_v6 = System.Net.Sockets.AddressFamily.InterNetworkV6 public static Task<List<MIB_TCPROW_OWNER_PID>> GetAllTCPConnectionsAsync() { return Task.Run(() => GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET)); } public static List<MIB_TCPROW_OWNER_PID> GetAllTCPConnections() { return GetTCPConnections<MIB_TCPROW_OWNER_PID, MIB_TCPTABLE_OWNER_PID>(AF_INET); } public static Task<List<MIB_TCP6ROW_OWNER_PID>> GetAllTCPv6ConnectionsAsync() { return Task.Run(()=>GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6)); } public static List<MIB_TCP6ROW_OWNER_PID> GetAllTCPv6Connections() { return GetTCPConnections<MIB_TCP6ROW_OWNER_PID, MIB_TCP6TABLE_OWNER_PID>(AF_INET6); } private static List<IPR> GetTCPConnections<IPR, IPT>(int ipVersion)//IPR = Row Type, IPT = Table Type { List<IPR> result = null; IPR[] tableRows = null; int buffSize = 0; var dwNumEntriesField = typeof(IPT).GetField("dwNumEntries"); // how much memory do we need? uint ret = GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL); IntPtr tcpTablePtr = Marshal.AllocHGlobal(buffSize); try { ret = GetExtendedTcpTable(tcpTablePtr, ref buffSize, true, ipVersion, TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL); if (ret != 0) return new List<IPR>(); // get the number of entries in the table IPT table = (IPT)Marshal.PtrToStructure(tcpTablePtr, typeof(IPT)); int rowStructSize = Marshal.SizeOf(typeof(IPR)); uint numEntries = (uint)dwNumEntriesField.GetValue(table); // buffer we will be returning tableRows = new IPR[numEntries]; IntPtr rowPtr = (IntPtr)((long)tcpTablePtr + 4); for (int i = 0; i < numEntries; i++) { IPR tcpRow = (IPR)Marshal.PtrToStructure(rowPtr, typeof(IPR)); tableRows[i] = tcpRow; rowPtr = (IntPtr)((long)rowPtr + rowStructSize); // next entry } } finally { result = tableRows?.ToList() ?? new List<IPR>(); // Free the Memory Marshal.FreeHGlobal(tcpTablePtr); } return result; } public static string GetTcpStateName(MIB_TCP_STATE state) { switch (state) { case MIB_TCP_STATE.MIB_TCP_STATE_CLOSED: return "Closed"; case MIB_TCP_STATE.MIB_TCP_STATE_LISTEN: return "Listen"; case MIB_TCP_STATE.MIB_TCP_STATE_SYN_SENT: return "SynSent"; case MIB_TCP_STATE.MIB_TCP_STATE_SYN_RCVD: return "SynReceived"; case MIB_TCP_STATE.MIB_TCP_STATE_ESTAB: return "Established"; case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT1: return "FinWait 1"; case MIB_TCP_STATE.MIB_TCP_STATE_FIN_WAIT2: return "FinWait 2"; case MIB_TCP_STATE.MIB_TCP_STATE_CLOSE_WAIT: return "CloseWait"; case MIB_TCP_STATE.MIB_TCP_STATE_CLOSING: return "Closing"; case MIB_TCP_STATE.MIB_TCP_STATE_LAST_ACK: return "LastAck"; case MIB_TCP_STATE.MIB_TCP_STATE_TIME_WAIT: return "TimeWait"; case MIB_TCP_STATE.MIB_TCP_STATE_DELETE_TCB: return "DeleteTCB"; default: return ((int)state).ToString(); } } private static readonly ConcurrentDictionary<string, string> DicOfIpToHostName = new ConcurrentDictionary<string, string>(); public const string UnknownHostName = "Unknown"; // ****************************************************************** public static string GetHostName(IPAddress ipAddress) { return GetHostName(ipAddress.ToString()); } // ****************************************************************** public static string GetHostName(string ipAddress) { string hostName = null; if (!DicOfIpToHostName.TryGetValue(ipAddress, out hostName)) { try { if (ipAddress == "0.0.0.0" || ipAddress == "::") { hostName = ipAddress; } else { hostName = Dns.GetHostEntry(ipAddress).HostName; } } catch (Exception ex) { Debug.Print(ex.ToString()); hostName = UnknownHostName; } DicOfIpToHostName[ipAddress] = hostName; } return hostName; } // ************************************************************************ /// <summary> /// Will search for the an active NetworkInterafce that has a Gateway, otherwise /// it will fallback to try from the DNS which is not safe. /// </summary> /// <returns></returns> public static NetworkInterface GetMainNetworkInterface() { List<NetworkInterface> candidates = new List<NetworkInterface>(); if (NetworkInterface.GetIsNetworkAvailable()) { NetworkInterface[] NetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach ( NetworkInterface ni in NetworkInterfaces) { if (ni.OperationalStatus == OperationalStatus.Up) candidates.Add(ni); } } if (candidates.Count == 1) { return candidates[0]; } // Accoring to our tech, the main NetworkInterface should have a Gateway // and it should be the ony one with a gateway. if (candidates.Count > 1) { for (int n = candidates.Count - 1; n >= 0; n--) { if (candidates[n].GetIPProperties().GatewayAddresses.Count == 0) { candidates.RemoveAt(n); } } if (candidates.Count == 1) { return candidates[0]; } } // Fallback to try by getting my ipAdress from the dns IPAddress myMainIpAdress = null; IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) // Get the first IpV4 { myMainIpAdress = ip; break; } } if (myMainIpAdress != null) { NetworkInterface[] NetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface ni in NetworkInterfaces) { if (ni.OperationalStatus == OperationalStatus.Up) { IPInterfaceProperties props = ni.GetIPProperties(); foreach (UnicastIPAddressInformation ai in props.UnicastAddresses) { if (ai.Address.Equals(myMainIpAdress)) { return ni; } } } } } return null; } // ****************************************************************** /// <summary> /// AddressFamily.InterNetwork = IPv4 /// Thanks to Dr. Wilys Apprentice at /// http://stackoverflow.com/questions/1069103/how-to-get-the-ip-address-of-the-server-on-which-my-c-sharp-application-is-runni /// using System.Net.NetworkInformation; /// </summary> /// <param name="mac"></param> /// <param name="addressFamily">AddressFamily.InterNetwork = IPv4, AddressFamily.InterNetworkV6 = IPv6</param> /// <returns></returns> public static IPAddress GetIpFromMac(PhysicalAddress mac, AddressFamily addressFamily = AddressFamily.InterNetwork) { NetworkInterface[] NetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface ni in NetworkInterfaces) { if (ni.GetPhysicalAddress().Equals(mac)) { if (ni.OperationalStatus == OperationalStatus.Up) { IPInterfaceProperties props = ni.GetIPProperties(); foreach (UnicastIPAddressInformation ai in props.UnicastAddresses) { if (ai.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred) { if (ai.Address.AddressFamily == addressFamily) { return ai.Address; } } } } } } return null; } // ****************************************************************** /// <summary> /// Return the best guess of main ipAdress. To get it in the form aaa.bbb.ccc.ddd just call /// '?.ToString() ?? ""' on the result. /// </summary> /// <returns></returns> public static IPAddress GetMyInternetIpAddress() { NetworkInterface ni = GetMainNetworkInterface(); IPAddress ipAddress = GetIpFromMac(ni.GetPhysicalAddress()); if (ipAddress == null) // could it be possible ? { ipAddress = GetIpFromMac(ni.GetPhysicalAddress(), AddressFamily.InterNetworkV6); } return ipAddress; } // ****************************************************************** public static bool IsBroadcastAddress(IPAddress ipAddress) { if (ipAddress.AddressFamily == AddressFamily.InterNetwork) { return ipAddress.GetAddressBytes()[3] == 255; } if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6) { return false; // NO broadcast in IPv6 } return false; } // ****************************************************************** public static bool IsMulticastAddress(IPAddress ipAddress) { if (ipAddress.AddressFamily == AddressFamily.InterNetwork) { // Source: https://technet.microsoft.com/en-us/library/cc772041(v=ws.10).aspx return ipAddress.GetAddressBytes()[0] >= 224 && ipAddress.GetAddressBytes()[0] <= 239; } if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6) { return ipAddress.IsIPv6Multicast; } return false; } // ****************************************************************** } }
And this is to get all local IPs in csv format in VB.NET
Imports System.Net Imports System.Net.Sockets Function GetIPAddress() As String Dim ipList As List(Of String) = New List(Of String) Dim host As IPHostEntry Dim localIP As String = "?" host = Dns.GetHostEntry(Dns.GetHostName()) For Each ip As IPAddress In host.AddressList If ip.AddressFamily = AddressFamily.InterNetwork Then localIP = ip.ToString() ipList.Add(localIP) End If Next Dim ret As String = String.Join(",", ipList.ToArray) Return ret End Function
To get the remote ip address the quickest way possible. You must have to use a downloader, or create a server on your computer.
The downsides to using this simple code: (which is recommended) is that it will take 3-5 seconds to get your Remote IP Address because the WebClient when initialized always takes 3-5 seconds to check for your proxy settings.
public static string GetIP() { string externalIP = ""; externalIP = new WebClient().DownloadString("http://checkip.dyndns.org/"); externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) .Matches(externalIP)[0].ToString(); return externalIP; }
Here is how I fixed it.. (first time still takes 3-5 seconds) but after that it will always get your Remote IP Address in 0-2 seconds depending on your connection.
public static WebClient webclient = new WebClient(); public static string GetIP() { string externalIP = ""; externalIP = webclient.DownloadString("http://checkip.dyndns.org/"); externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) .Matches(externalIP)[0].ToString(); return externalIP; }