Squ*_*rel 11 c# ip networking lan network-programming
我现在已经在网上爬了大约5个小时,但找不到我的问题的解决方案:
我的公司正在开发一款教育游戏,我正在使用Monotorrent为它编写一个autoupdater.该游戏将在学校中使用,但由于大多数学校只有非常弱的互联网连接,因此网络中只应有一台从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
);
}
}
Run Code Online (Sandbox Code Playgroud)
或者类似的技术只提供路由器/交换机/其他信息.
简而言之,我想要做的是检查是否可以通过LAN访问给定的IP.
我真的很感激任何帮助,因为这个功能是剩下的最后一个:)
Jon*_*son 17
你可以利用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;
}
Run Code Online (Sandbox Code Playgroud)
但是,请记住它被称为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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8359 次 |
| 最近记录: |