【问题标题】:Get all possible IPs between 2 given addresses获取 2 个给定地址之间的所有可能 IP
【发布时间】:2020-10-13 22:27:17
【问题描述】:

我一直在关注this question 上的答案,但使用答案中的代码并不能按照我想要的方式工作。

我希望有某种方法来获取两个给定 IP 之间的所有可能 IP(如问题所述)并将它们存储在数组或某种对象中,但那里的 OP 没有尝试使用图书馆建议,如评论。

我正在使用 .NET Core 3.1。

主要:

static void Main(string[] args)
{
    if (args.Length < 4)
    {
        throw new ApplicationException("Not enough args!");
    }
    Console.WriteLine("Sufficient arguments.");

    IPAddress ipRangeStart = IPAddress.Parse(args[0]);
    IPAddress ipRangeEnd = IPAddress.Parse(args[1]);
    Console.WriteLine("IPs parsed.");
    int port;
    try
    {
        port = Convert.ToInt32(args[2]);
    }
    catch (Exception)
    {
        throw new FormatException("Invalid port value!");
    }

    if (port > 65535 || port < 1) throw new InvalidOperationException("Port must be in the valid range!");
            
    Console.WriteLine("Port integer parsed.");

    string filePath = args[3];

    if (!(File.Exists(filePath))) File.Create(filePath);
            
    Console.WriteLine("Output file resolved.");

    IPAddressRange addies = new IPAddressRange(ipRangeStart, ipRangeEnd);

    Console.WriteLine("IP range created.");

    List<IPAddy> ipList = new List<IPAddy>();
            
    Console.WriteLine("IP list initialized.");
            
    Console.WriteLine("Adding IPs to list...");
            
    // Program hangs here
    
    foreach (var ip in addies)
    {
        Console.WriteLine("Parsing: " + ip.ToString());
        ipList.Add(new IPAddy(ip.ToString()));    
    }
            
    Console.WriteLine("IP range parsed.");
            
    Console.WriteLine("Scanning...");
    Dictionary<string, bool > ipsEvaluated = Scanner.ScanRanges(ipList.ToArray(), port);

    Console.WriteLine("Evaluating keys...");
    string[] IPPortsOpen = ipsEvaluated.getTrueKeys();
            
    Console.WriteLine("Writing results...");
    StreamWriter sw = new StreamWriter(filePath, true);

    foreach (string i in IPPortsOpen)
    {
        sw.WriteLine(i);
    }
            
    Console.WriteLine("Done!");
}

【问题讨论】:

    标签: c# .net-core ip ip-address


    【解决方案1】:

    这是 IPv4 吗?还是 IPv6?如果我们假设 IPv4... 那么 IP 地址实际上只是 32 位大端无符号整数。我们以 125.80.207.121 和 141.221.132.118 为例;现在用十六进制来考虑它们......

    十进制 125.80.207.121 是十六进制 7D.50.CF.79; 7D50CF79是2102447993

    十进制 141.221.132.118 是十六进制 8D.DD.84.4F; 8DDD844F是2380104783

    因此,当考虑 32 位大端无符号值时,125.80.207.121 和 141.221.132.118 之间的 IP 地址与 2102447993 和 2380104783 之间的 整数 相同 - 然后只需拆分八位字节将每个字节输出为一个整数。

    【讨论】:

    • @ryzenup 是 - 或者更确切地说是运行时;在语言级别,它不需要它们 - 值就是值 - 没有“十六进制整数”的概念,甚至没有“十进制整数”的概念 - 只是一个整数。但你要找的可能是someHex = someInteger.ToString("x2") 和someInteger = Convert.ToInt32(someHex, 16)
    • @ryzenup 虽然你可能更喜欢在这里使用uint(又名UInt32):var val = Convert.ToUInt32("7D50CF79", 16); // 2102447993
    • 我将 IP 存储为什么?
    • @ryzenup "x2" 是一个格式说明符,意思是“十六进制”(给或取);我们的Convert 调用中的16 是fromBase 参数——我们从base-16(又名十六进制)解析
    • @ryzenup “我将 IP 存储为什么” - 你告诉我;您想要将它们存储为什么?如果您尝试在某个范围内迭代 IPv4 地址,那么uint 是最明显的选择
    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 2012-09-17
    • 2014-12-31
    • 2018-10-08
    • 1970-01-01
    • 2016-09-24
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多