gpt4 book ai didi

c# - 检查 IP 是否在 LAN 中(在防火墙和路由器后面)

转载 作者:可可西里 更新时间:2023-11-01 08:38:54 24 4
gpt4 key购买 nike

我已经在网上爬行了大约 5 个小时,但找不到解决我的问题的方法:

我的公司正在开发一款教育游戏,我正在使用 Monotorrent 为其编写一个自动更新程序。该游戏将在学校使用,但由于大多数学校的互联网连接非常弱,因此网络中应该只有一台计算机从 httpseeder 下载,而其他计算机应该从从 httpseed 下载的一台计算机上下载。

所以我从跟踪器中获取了大量的 IP 地址,并且只需要过滤掉 LAN 中的 IP 地址。

当然,有时学校对防火墙的要求非常严格,学校的一些计算机之间会有大量的路由器和交换机。

我已经尝试过大多数解决方案,例如

 NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();

foreach (NetworkInterface iface in interfaces)
{
IPInterfaceProperties properties = iface.GetIPProperties();

foreach (UnicastIPAddressInformation address in properties.UnicastAddresses)
{
Console.WriteLine(
"{0} (Mask: {1})",
address.Address,
address.IPv4Mask
);
}
}

或者类似的技术只传递路由器/交换机/任何东西的信息。

所以简而言之,我想做的是检查给定的 IP 是否可以通过 LAN 访问。

我真的很感激任何帮助,因为这个功能是最后一个剩下的:)

最佳答案

您可以利用 TTL。 TTL 为 1 时,数据包将无法到达互联网:

private static bool IsLanIP(IPAddress address)
{
var ping = new Ping();
var rep = ping.Send(address, 100, new byte[] { 1 }, new PingOptions()
{
DontFragment = true,
Ttl = 1
});
return rep.Status != IPStatus.TtlExpired && rep.Status != IPStatus.TimedOut && rep.Status != IPStatus.TimeExceeded;
}

但是,请记住它被称为 IPv4 掩码是有原因的 - 您可以将其作为一个掩码使用(因此这是您的算法解决方案):

private static bool IsLanIP(IPAddress address)
{
var interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (var iface in interfaces)
{
var properties = iface.GetIPProperties();
foreach (var ifAddr in properties.UnicastAddresses)
{
if (ifAddr.IPv4Mask != null &&
ifAddr.Address.AddressFamily == AddressFamily.InterNetwork &&
CheckMask(ifAddr.Address, ifAddr.IPv4Mask, address))
return true;
}
}
return false;
}

private static bool CheckMask(IPAddress address, IPAddress mask, IPAddress target)
{
if (mask == null)
return false;

var ba = address.GetAddressBytes();
var bm = mask.GetAddressBytes();
var bb = target.GetAddressBytes();

if (ba.Length != bm.Length || bm.Length != bb.Length)
return false;

for (var i = 0; i < ba.Length; i++)
{
int m = bm[i];

int a = ba[i] & m;
int b = bb[i] & m;

if (a != b)
return false;
}

return true;
}

关于c# - 检查 IP 是否在 LAN 中(在防火墙和路由器后面),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7232287/

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