本帖最后由 Grapevine 于 2014-10-15 09:41:55 编辑

解决方案 »

  1.   

    知道IP和子网掩码,计算可用IP数量和可用的IP地址
      

  2.   

    错了.
    应该是这样:
    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,每个都加上起始地址,就是最终要分配的地址池
      

  3.   

    判断0的数量可以用192除以2的N次方,看除到多少不能整除,而不用非转二进制
    左移位:x=y<<j 把y左移j位的值给x
    又移位:x=y>>j
      

  4.   

     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 能帮改下吗?
      

  5.   

    下面代码输出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();
        }
    }
      

  6.   

    那如果是B类地址呐?
    我实在是转不过来这个弯
    这个方法很靠谱
    B类地址,你直接计算第三段就好了,第四段就是0
    就是说,IP地址一共分4段,哪一段不是255或0,才需要计算
      

  7.   


    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;
        }
    }
      

  8.   

    直接一个个的ping ,不行吗?做个记录就是你想要的。
      

  9.   

    那如果是B类地址呐?
    我实在是转不过来这个弯方法一样的,例如掩码是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学习指南》第三章