CSharp - 如何获取运行 C# 应用程序的服务器的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地址,你需要迭代他们的集合来找到合适的。


if (ip.AddressFamily.ToString() =="InterNetwork")



对此:


if (ip.AddressFamily == AddressFamily.InterNetwork)



知道你的外部IP的唯一方法是让别人告诉你;这个代码可以帮助你:


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;


}




//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类,它具有一个 static GetAllNetworkInterfaces方法。

这里方法将返回计算机上的所有"网络接口",即使你只有一个无线适配器和/或者以太网适配器硬件。 尽管你只需要一个网络接口,但所有这些网络接口都有有效的本地计算机IP地址。

如果你正在寻找一个IP地址,那么你需要过滤 List,直到你能够识别正确的地址。 你可能需要进行一些实验,但我已经成功地使用了以下方法:

  • 检查不活动的任何 NetworkInterfaces,方法是检查 OperationalStatus == OperationalStatus.Up 如果没有插入网络电缆,这将排除你的物理以太网适配器。

在each的each中,可以使用 GetIPProperties方法获取一个 IPInterfaceProperties对象,并且从IPInterfaceProperties对象访问 List对象的UnicastAddresses属性。

  • 通过检查非首选的单播地址筛选出 DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • 通过检查"虚拟"地址筛选出地址 AddressPreferredLifetime!= UInt32.MaxValue

现在我将获取与所有这些过滤器匹配的第一个( 如果有的话) 单播地址的地址。

编辑:


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



刚在机器上测试过这个。

如果要避免使用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);


 }


 }


}



string ipAddress = new WebClient().DownloadString("http://icanhazip.com");

要获取当前外部IP地址,只需在page load事件上用以下行创建一个ASPX页:


Response.Write(HttpContext.Current.Request.UserHostAddress.ToString());



...