如何在C#中获取IP范围?

时间:2012-04-27 07:58:11

标签: c# ip range

我是新手。我写了一个程序来获得C#4.0中的IP Range它适用于小范围但是当我去A类IP地址这样的范围时,我的程序需要花费很多时间。需要一些帮助。这是我的代码(这不是一个好方法)。有任何建议以更好的方式写作。?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ipSplitt
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            string[] z = new string[4];
            int t = 0;
            string ip = "3.0.0.0";

            string[] Ip = ip.Split(new char[] { '.' });

            foreach (string m in Ip)
            {
                z[t] = m;
                t++;
            } 

            int a1, b1, c1, d1 = 0;

            a1 = Convert.ToInt32(z[0]);
            b1 = Convert.ToInt32(z[1]);
            c1 = Convert.ToInt32(z[2]);
            d1 = Convert.ToInt32(z[3]);

            string[] v = new string[4];
            string ip2 = "3.255.255.255";
            int l = 0;
            string[] Ip2 = ip2.Split(new char[] { '.' });

            foreach (string m in Ip2)
            {
                v[l] = m;
                l++;
            } 

            int a2, b2, c2, d2 = 0;

            a2 = Convert.ToInt32(v[0]);
            b2 = Convert.ToInt32(v[1]);
            c2 = Convert.ToInt32(v[2]);
            d2 = Convert.ToInt32(v[3]);

            while (d2 >= d1 || c2 > c1 || b2 > b1 || a2 > a1)
            {
                if (d1 > 255)
                {
                    d1 = 1;
                    c1++;
                }

                if (c1 > 255)
                {
                    c1 = 1;
                    b1++;
                }

                if (b1 > 255)
                {
                    b1 = 1;
                    a1++;
                }

                using (StreamWriter writer = new StreamWriter("import.txt",true))
                    writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1);

                d1++;
            }
        }
    }
}

7 个答案:

答案 0 :(得分:5)

  

但是当我去A类IP地址这样的范围时,我的程序需要花费很多时间

因为您打开和关闭文件句柄255 ^ 3次。将using(Streamwriter ...)块放在外部while循环周围。

答案 1 :(得分:1)

查看.NET框架中的IPAddress classstatic Parse函数。

答案 2 :(得分:1)

很多时候去看这个

using (StreamWriter writer = new StreamWriter("import.txt",true))
                writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1);

所以你应该这样做

        StringBuilder sb = new StringBuilder(Int32.MaxValue);
        sb.Append(a1.ToString() + "." + b1.ToString() + "." + c1.ToString() + "." + d1.ToString() + "\n");

毕竟只是打电话

        File.WriteAllLines("import.txt", sb.ToString().Split('\n'));

答案 3 :(得分:1)

StringBuilder解决方案在我的系统上抛出内存不足,所以你应该简单地添加

 StreamWriter writer = new StreamWriter("import.txt");

在你的功能之上然后替换

 using (StreamWriter writer = new StreamWriter("import.txt",true))
            writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1);

writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1);

并添加

writer.Close();

到底部。在10秒内完成。

答案 4 :(得分:1)

你的方法很简单,这里已经有了很好的答案。但是......什么是IP地址?它是一个四字节整数,对吗?那么为什么不将范围限制解析为int32,然后使用掩码在输出流之间打印数字以获得十进制表示:

127.0.0.1 = 01111111 00000000 00000000 00000001
a = ip & 0xFF000000
b = ip & 0x00FF0000 
c = ip & 0x0000FF00
d = ip & 0x000000FF

但仍然不要忘记将流初始化为循环。

答案 5 :(得分:0)

每次打开文件都会为每个IP刷新一次。将using语句放在while块中。

答案 6 :(得分:0)

写入文件import.txt的语句是导致循环变慢的主要元凶。我认为你应该用ips.AppendLine(a1 + "." + b1 + "." + c1 + "." + d1);替换StreamWriter代码。这里,ips是一个StringBuilder对象。 在循环之外,我写了以下代码:

StreamWriter writer = new StreamWriter("import.txt", false))
char[]  arr ;

arr = new char[ips.Length]  ;
ips.CopyTo(0, arr, 0, ips.Length) ;

writer.Write(arr);
writer.Dispose()

这里我不会将StringBuilder中的字符串转储到import.txt。但我复制到char []然后我转储。我观察到这要快得多。我希望这有帮助!!