Board logo

标题: [特效代码] 这个计算【IP网段,主机数】的算法用批处理如何实现呢? [打印本页]

作者: xzwcn    时间: 2012-12-2 15:41     标题: 这个计算【IP网段,主机数】的算法用批处理如何实现呢?

算法介绍:
IP地址,子网掩码,网络地址,广播地址,地址范围,主机数_心静如水的空间_百度空间
2012-12-01 09:30:06 笔记本:.默认笔记本
【例1】下面例子IP地址为192·168·100·5 子网掩码是255·255·255·0。算出网络地址、广播地址、地址范围、主机数
1、分步骤计算
  1)将IP地址和子网掩码换算为二进制,子网掩码连续全1的是网络地址,后面的是主机地址。
           192.168.100.5     11000000.10101000.01100100.00000101
           255.255.255.0     11111111.11111111.11111111.00000000



  2)IP地址和子网掩码进行与运算,结果是网络地址
           192.168.100.5     11000000.10101000.01100100.00000101
           255.255.255.0     11111111.11111111.11111111.00000000
       与运算______________________________________________________________
      结果为: 192.168.100.0     11000000.10101000.01100100.00000000



  3) 将上面的网络地址中的网络地址部分不变,主机地址变为全1,结果就是广播地址。
    网络地址为: 192.168.100.0     11000000.10101000.01100100.00000000
    ___________________________________________________________________________
    将主机地址变为全1 
    广播地址为: 192.168.100.255    11000000.10101000.01100100.11111111


  4) 地址范围就是含在本网段内的所有主机
    网络地址+1即为第一个主机地址,广播地址-1即为最后一个主机地址,由此可以看出
    地址范围是: 网络地址+1 至 广播地址-1
    本例的网络范围是:192·168·100·1 至 192·168·100·254
    也就是说下面的地址都是一个网段的。
    192·168·100·1、192·168·100·2 ... 192·168·100·20 ... 192·168·100·111... 192·168·100·254


  5) 主机的数量
    主机的数量=2二进制的主机位数-2
  减2是因为主机不包括网络地址和广播地址。本例二进制的主机位数是8位。
    主机的数量=28-2=254

【例2】IP地址为128·36·199·3 子网掩码是255·255·240·0。算出网络地址、广播地址、地址范围、主机数。
  1) 将IP地址和子网掩码换算为二进制,子网掩码连续全1的是网络地址,后面的是主机地址, 虚线前为网络地址,虚线后为主机地址
           128?36?199?3????????????? 10000000?00100100?1100 0111?00000011
           255?255?240?0??????????? 11111111?11111111?1111 0000?00000000
  2)IP地址和子网掩码进行与运算,结果是网络地址
           128?36?199?3????????????? 10000000?00100100?1100 0111?00000011
           255?255?240?0??????????? 11111111?11111111?1111 0000?00000000
   与运算   ______________________________________________________________
   结果为网络地址:128?36?192?0   10000000?00100100?1100 0000?00000000

  3)将运算结果中的网络地址不变,主机地址变为1,结果就是广播地址。
           128?36?192?0   10000000?00100100?1100 0000?00000000
         ______________________________________________________________
     广播地址: 128?36?207?255????????? 10000000?00100100?1100 1111?11111111
  4) 地址范围就是含在本网段内的所有主机
  网络地址+1即为第一个主机地址,广播地址-1即为最后一个主机地址,由此可以看出
  本例的网络范围是:128?36?192?1???至????? 128?36?207?254
  5) 主机的数量
  主机的数量=2二进制位数的主机-2=212-2=4094
  从上面两个例子可以看出不管子网掩码是标准的还是特殊的,计算网络地址、广播地址、地址数时只要把地址换算成二进制,然后从子网掩码处分清楚连续1以前的是网络地址,后是主机地址进行相应计算即可


【C#版的代码---只计算了网段有哪些IP。。。】:       

//有错误,如IP为:192.168.1.1 子网:255.255.255.0 的所在网段是:192.168.1.1---192.168.1.254 【除去网络地址和广播地址】
而这个算法的结果为:192.168.1.0---192.168.1.254。。。
  1. private byte[] NetIPDeal(byte[] localip, byte[] submask)
  2.         {
  3.             byte[] result = { 0, 0, 0, 0 };
  4.             int[] temp = { 0, 0, 0, 0 };
  5.             for (int i = 0; i < 4; i++)
  6.             {
  7.                 temp[i] = (int)localip[i] & (int)submask[i];
  8.                 result[i] = (byte)temp[i];
  9.             }
  10.             return result;
  11.         }
  12.         private void GetDestIp(string strlocalip, string strsubmask)
  13.         {
  14.             byte[] submask = { 0, 0, 0, 0 };
  15.             byte[] localip = { 0, 0, 0, 0 };
  16.             IPAddress ip = IPAddress.Parse(strlocalip);
  17.             localip = ip.GetAddressBytes();
  18.             ip = IPAddress.Parse(strsubmask);
  19.             submask = ip.GetAddressBytes();
  20.             int[] interval = { 0, 0, 0, 0 };
  21.             byte[] top = { 0, 0, 0, 0 };
  22.             byte[] bottom = { 0, 0, 0, 0 };
  23.             byte[] netip = { 0, 0, 0, 0 };
  24.             for (int i = 0; i < 4; i++)
  25.             {
  26.                 if (submask[i] != 255)
  27.                     interval[i] = 255 - (int)submask[i] + 1;
  28.             }
  29.             netip = NetIPDeal(localip, submask);
  30.             byte temp;
  31.             for (int i = 0; i < 4; i++)
  32.             {
  33.                 temp = localip[i];
  34.                 if (interval[i] != 0)
  35.                 {
  36.                     int temp_result;
  37.                     temp_result = (int)temp & (int)(submask[i]);
  38.                     if (interval[i] != 256)
  39.                     {
  40.                         while (temp_result == (int)netip[i])
  41.                         {
  42.                             temp++;
  43.                             temp_result = (int)temp & (int)(submask[i]);
  44.                         }
  45.                         top[i] = (byte)((int)temp - 1);
  46.                         bottom[i] = (byte)((int)top[i] - interval[i] + 1);
  47.                     }
  48.                     else
  49.                     {
  50.                         top[i] = 254; bottom[i] = 0;
  51.                     }
  52.                 }
  53.                 else
  54.                 {
  55.                     top[i] = (byte)temp; bottom[i] = top[i];
  56.                 }
  57.             }
  58.             for (byte i = bottom[0]; i <= top[0]; i++)
  59.             {
  60.                 for (byte j = bottom[1]; j <= top[1]; j++)
  61.                 {
  62.                     for (byte k = bottom[2]; k <= top[2]; k++)
  63.                     {
  64.                         for (byte t = bottom[3]; t <= top[3]; t++)
  65.                         {
  66.                             string dest;
  67.                             dest = i.ToString() + "." + j.ToString() + "." + k.ToString() + "." + t.ToString();
  68.                             this.listBox1.Items.Add(dest);
  69.                         }
  70.                     }
  71.                 }
  72.             }
  73.         }
复制代码
[attach]5934[/attach]

[attach]5935[/attach]
作者: xzwcn    时间: 2012-12-2 15:45

C#源代码.zip_免费高速下载|百度云 网盘-分享无限制
http://pan.baidu.com/share/link?shareid=136402&uk=2870668148
作者: xzwcn    时间: 2012-12-5 21:42

没人会么?
作者: hlzj88    时间: 2012-12-5 23:13

你的文章太长 没仔细看 要不你看看这个能不能参考
http://www.bathome.net/thread-7050-1-1.html
win7下测试会自动关闭 原因? 不知道




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2