【问题标题】:How to get ip Ranges in C#?如何在 C# 中获取 ip 范围?
【发布时间】:2012-05-07 23:35:25
【问题描述】:

我是新手。我在 C# 4.0 中编写了一个获取 IP 范围的程序,它适用于小范围,但是当我使用 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++;
            }
        }
    }
}

【问题讨论】:

    标签: c# ip range


    【解决方案1】:

    但是当我选择 A 类 IP 地址等范围时,我的程序会花费很多时间

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

    【讨论】:

      【解决方案2】:

      看看.NET框架中的IPAddress class,以及static Parse函数。

      【讨论】:

      • 这不是 OP 正在做的事情。他不是在解析它们,而是在打印。
      • 那时我可能理解错了他的问题。 PS。 +1为您的答案。在我写完答案后才注意到它。但是当我想编辑时,你已经回答了。
      【解决方案3】:

      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】:

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

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

        但还是不要忘记在循环外初始化一个流。

        【讨论】:

          【解决方案5】:

          很多时间去这个

          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'));
          

          【讨论】:

          • 在我的系统上抛出内存不足异常
          • 在投反对票之前尝试这样做 StringBuilder(Int32, Int32)
          • 这次在StringBuilder初始化时抛出异常,前一次在抛出异常前使用了超过500M的内存。我觉得这有点问题
          • 另外;您的代码的第一个版本在 String.Split 操作上引发异常,而不是在 StringBuilding 上。我的平台 Windows XP x64 4 GB RAM
          • 问题不是StringBuilder,问题是你的方法不好。因为您使用 StringBuilder 分配了巨大的内存,然后使用 String.Split 创建了一个 String 数组,这意味着您将使用的内存加倍。这是一个小型的单次运行应用程序,它不应该使用超过 1GB 的内存。可能它适用于您的系统,但正如我所说,这不是一个好方法
          【解决方案6】:

          您每次都打开文件,因此每个 IP 都会刷新它。将 using 语句放在 while 块周围。

          【讨论】:

            【解决方案7】:

            写入文件 import.txt 的语句是导致循环变慢的罪魁祸首。我认为您应该将 StreamWriter 代码替换为 ips.AppendLine(a1 + "." + b1 + "." + c1 + "." + d1); 这里, 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[] 然后转储。我观察到这要快得多。我希望这会有所帮助!

            【讨论】:

              猜你喜欢
              • 2021-12-15
              • 2021-09-14
              • 2010-12-07
              • 2020-05-05
              • 1970-01-01
              • 2012-11-10
              • 1970-01-01
              • 1970-01-01
              • 2012-05-18
              相关资源
              最近更新 更多