gpt4 book ai didi

c# - 如何获得*互联网* IP?

转载 作者:可可西里 更新时间:2023-11-01 03:13:03 27 4
gpt4 key购买 nike

设想一种情况,我的 PC 有两个网卡,一个连接到互联网,另一个连接到本地网络,我如何用 C# 检测连接到互联网的 IP?

最佳答案

试试这个:

static IPAddress getInternetIPAddress()
{
try
{
IPAddress[] addresses = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress gateway = IPAddress.Parse(getInternetGateway());
return findMatch(addresses, gateway);
}
catch (FormatException e) { return null; }
}

static string getInternetGateway()
{
using (Process tracert = new Process())
{
ProcessStartInfo startInfo = tracert.StartInfo;
startInfo.FileName = "tracert.exe";
startInfo.Arguments = "-h 1 208.77.188.166"; // www.example.com
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
tracert.Start();

using (StreamReader reader = tracert.StandardOutput)
{
string line = "";
for (int i = 0; i < 9; ++i)
line = reader.ReadLine();
line = line.Trim();
return line.Substring(line.LastIndexOf(' ') + 1);
}
}
}

static IPAddress findMatch(IPAddress[] addresses, IPAddress gateway)
{
byte[] gatewayBytes = gateway.GetAddressBytes();
foreach (IPAddress ip in addresses)
{
byte[] ipBytes = ip.GetAddressBytes();
if (ipBytes[0] == gatewayBytes[0]
&& ipBytes[1] == gatewayBytes[1]
&& ipBytes[2] == gatewayBytes[2])
{
return ip;
}
}
return null;
}

请注意,findMatch() 的实现依赖于 C 类匹配。如果要支持 B 类匹配,只需省略 ipBytes[2] == gatewayBytes[2] 的检查即可。

编辑历史:

  • 已更新为使用 www.example.com
  • 已更新以包含 getInternetIPAddress(),以展示如何使用其他方法。
  • 已更新以在 getInternetGateway() 无法解析网关 IP 时捕获 FormatException。 (如果网关路由器配置为不响应 traceroute 请求,就会发生这种情况。)
  • 引用了 Brian Rasmussen 的评论。
  • 已更新为使用 www.example.com 的 IP,这样即使 DNS 服务器关闭也能正常工作。

关于c# - 如何获得*互联网* IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/515436/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com