请教已知IP地址和子网掩码,列出所有子网的计算方法,谢谢! 本帖最后由 Grapevine 于 2014-10-15 09:41:55 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 知道IP和子网掩码,计算可用IP数量和可用的IP地址 错了.应该是这样:192.168.1.2->192.168.1.0000,0010起始地址子网掩码255.255.255.192->11111111.11111111.11111111.11000000前面1代表网络号,后面0才是可分配的地址先用255-192=63,变成00111111然后循环0-63,每个都加上起始地址,就是最终要分配的地址池 判断0的数量可以用192除以2的N次方,看除到多少不能整除,而不用非转二进制左移位:x=y<<j 把y左移j位的值给x又移位:x=y>>j public string Get_IPnum(string IP, string Mask) { string[] Iptmp = IP.Split('.'); int tIP = 0; int iIP = 0; int iMask = 0; for (int i = 0; i < 4; i++) // 把IP从字符串的表示形式改成整型的形式 { tIP = byte.Parse(Iptmp[i]); iIP += (tIP << (3 - i) * 8); } Iptmp = Mask.Split('.'); for (int i = 0; i < 4; i++) // 把掩码从字符串的表示形式改成整型的形式 { tIP = byte.Parse(Iptmp[i]); iMask += (tIP << (3 - i) * 8); } tIP = iIP & iMask; string NetID = ((byte)(tIP >> 24)).ToString(); // 网络ID, IP段 for (int i = 1; i < 4; i++) { NetID += "." + ((byte)(tIP >> (3 - i) * 8)).ToString(); } return NetID; }我找了一个得到IP段的代码,但是不会改成获得所有的。请问Z65443344 能帮改下吗? 下面代码输出62个IP(扣除子网id和广播地址)。如果要包含id和广播,可以static void Main(){ IPRange ipRange = new IPRange(IPAddress.Parse("192.168.1.2"), IPAddress.Parse("255.255.255.192")); foreach (var ip in ipRange) { Console.WriteLine(ip); }}class IPRange : IEnumerable<IPAddress>{ uint start, end; public IPRange(IPAddress ip, IPAddress mask) { uint aBits = BitConverter.ToUInt32(ip.GetAddressBytes().Reverse().ToArray(), 0); uint mBits = BitConverter.ToUInt32(mask.GetAddressBytes().Reverse().ToArray(), 0); this.start = (aBits & mBits); this.end = (start ^ ~mBits); } public IEnumerator<IPAddress> GetEnumerator() { const int Trim = 1; // 去除子网id和广播地址。设为0则全部包括。 for (uint i = start + Trim; i <= end - Trim; i++) { byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((int)i)); yield return new IPAddress(bytes); } } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); }} 那如果是B类地址呐?我实在是转不过来这个弯这个方法很靠谱B类地址,你直接计算第三段就好了,第四段就是0就是说,IP地址一共分4段,哪一段不是255或0,才需要计算 static void Main(string[] args){ foreach (var ip in ListSubnets(IPAddress.Parse("192.168.1.2"), IPAddress.Parse("255.255.255.192"))) { Console.WriteLine(ip); }}static IEnumerable<IPAddress> ListSubnets(IPAddress ip, IPAddress mask){ Func<IPAddress, uint> ipToUint = x => { byte[] bytes = x.GetAddressBytes(); Array.Reverse(bytes); return BitConverter.ToUInt32(bytes, 0); }; uint ipValue = ipToUint(ip); uint maskValue = ipToUint(mask); // 判断是C类,B类,还是A类地址 uint classValue = ipValue >= 0xC0000000 ? 0xFFFFFF00 : ipValue >= 0x80000000 ? 0xFFFF0000 : 0xFF000000; uint subnetId = ipValue & classValue; uint step = (~maskValue) + 1; uint count = (maskValue - classValue) / step + 1; for (uint i = 0; i < count; i++) { yield return new IPAddress(BitConverter.GetBytes(IPAddress.HostToNetworkOrder((int)subnetId))); subnetId += step; }} 直接一个个的ping ,不行吗?做个记录就是你想要的。 那如果是B类地址呐?我实在是转不过来这个弯方法一样的,例如掩码是255.255.192.0,256-192=64,那么子网就是:x.x.0.0x.x.(0+64).0x.x.(0+64*2).0x.x.(0+64*3).0你要是想系统学习,请看《CCNA学习指南》第三章 datagridview 查询列不一样 c#读txt文件的简单问题!! 【控件】泛型集合如何能出现在自定义控件属性中,并可视编辑。。。。 窗体调用 会vb6和c#.net,用哪个做c/s桌面程序好?比较理由 如何设置窗体类属性的默认值? 怎么在.Net 2.0里面判断空对象都会出错的? winform UserControl 怎么根据窗口的大小而适应呢 winform下如何改变dataGrid指定某行的样式(如颜色等) 利用HyperLink控件能够将服务器上的文件下载吗 C#winform 线程启动窗体 未响应问题 C#中解决方案中包含多个项目有何意义?
应该是这样:
192.168.1.2->192.168.1.0000,0010起始地址
子网掩码
255.255.255.192->11111111.11111111.11111111.11000000
前面1代表网络号,后面0才是可分配的地址
先用255-192=63,变成00111111
然后循环0-63,每个都加上起始地址,就是最终要分配的地址池
左移位:x=y<<j 把y左移j位的值给x
又移位:x=y>>j
{
string[] Iptmp = IP.Split('.');
int tIP = 0;
int iIP = 0;
int iMask = 0;
for (int i = 0; i < 4; i++) // 把IP从字符串的表示形式改成整型的形式
{
tIP = byte.Parse(Iptmp[i]);
iIP += (tIP << (3 - i) * 8);
} Iptmp = Mask.Split('.');
for (int i = 0; i < 4; i++) // 把掩码从字符串的表示形式改成整型的形式
{
tIP = byte.Parse(Iptmp[i]);
iMask += (tIP << (3 - i) * 8);
} tIP = iIP & iMask; string NetID = ((byte)(tIP >> 24)).ToString(); // 网络ID, IP段
for (int i = 1; i < 4; i++)
{
NetID += "." + ((byte)(tIP >> (3 - i) * 8)).ToString();
}
return NetID;
}我找了一个得到IP段的代码,但是不会改成获得所有的。请问Z65443344 能帮改下吗?
{
IPRange ipRange = new IPRange(IPAddress.Parse("192.168.1.2"), IPAddress.Parse("255.255.255.192"));
foreach (var ip in ipRange)
{
Console.WriteLine(ip);
}
}class IPRange : IEnumerable<IPAddress>
{
uint start, end;
public IPRange(IPAddress ip, IPAddress mask)
{
uint aBits = BitConverter.ToUInt32(ip.GetAddressBytes().Reverse().ToArray(), 0);
uint mBits = BitConverter.ToUInt32(mask.GetAddressBytes().Reverse().ToArray(), 0);
this.start = (aBits & mBits);
this.end = (start ^ ~mBits);
} public IEnumerator<IPAddress> GetEnumerator()
{
const int Trim = 1; // 去除子网id和广播地址。设为0则全部包括。
for (uint i = start + Trim; i <= end - Trim; i++)
{
byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((int)i));
yield return new IPAddress(bytes);
}
} System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
我实在是转不过来这个弯
这个方法很靠谱
B类地址,你直接计算第三段就好了,第四段就是0
就是说,IP地址一共分4段,哪一段不是255或0,才需要计算
static void Main(string[] args)
{
foreach (var ip in ListSubnets(IPAddress.Parse("192.168.1.2"), IPAddress.Parse("255.255.255.192")))
{
Console.WriteLine(ip);
}
}
static IEnumerable<IPAddress> ListSubnets(IPAddress ip, IPAddress mask)
{
Func<IPAddress, uint> ipToUint = x =>
{
byte[] bytes = x.GetAddressBytes(); Array.Reverse(bytes);
return BitConverter.ToUInt32(bytes, 0);
}; uint ipValue = ipToUint(ip);
uint maskValue = ipToUint(mask);
// 判断是C类,B类,还是A类地址
uint classValue = ipValue >= 0xC0000000 ? 0xFFFFFF00 : ipValue >= 0x80000000 ? 0xFFFF0000 : 0xFF000000;
uint subnetId = ipValue & classValue;
uint step = (~maskValue) + 1;
uint count = (maskValue - classValue) / step + 1;
for (uint i = 0; i < count; i++)
{
yield return new IPAddress(BitConverter.GetBytes(IPAddress.HostToNetworkOrder((int)subnetId)));
subnetId += step;
}
}
我实在是转不过来这个弯方法一样的,例如掩码是255.255.192.0,256-192=64,那么子网就是:
x.x.0.0
x.x.(0+64).0
x.x.(0+64*2).0
x.x.(0+64*3).0你要是想系统学习,请看《CCNA学习指南》第三章