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)

不需要 ToString 来进行比较。

了解你的公共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;
}

清洁和一个解决方案中的全部: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方法。

这里方法将返回计算机上的所有"网络界面",并且通常有很多,即使你的计算机上安装了无线适配器和/或者以太网适配器硬件。 所有这些网络接口都有有效的本地计算机IP地址,但你可能只需要一个。

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

  • 通过检查来过滤掉任何非活动的NetworkInterfaces OperationalStatus == OperationalStatus.Up 这将排除你的物理以太网适配器,例如如果你没有插入网络电缆。

于一 List的相关 UnicastIPAddressInformation objects,对于每个 NetworkInterface,你可以得到一个 IPInterfaceProperties 对象通过 GetIPProperties方法,并从一个IPInterfaceProperties对象,我们可以访问该 . UnicastAddresses属性

  • 通过检查non-preferred单播地址筛选出 DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred
  • 通过检查"虚拟"地址筛选出地址 AddressPreferredLifetime!= UInt32.MaxValue

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


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

我只是想添加自己的one-liner ( 尽管还有许多其他有用的答案) 。


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

要获取当前的公共IP地址,你需要做的就是在页面加载事件中创建一个具有以下行的ASPX页面:


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

...