提问者:小点点

基于给定整数生成连续IPv4地址


/// <summary>
    /// Create IP part of the client information payload.
    /// </summary>
    /// <param name="index">Index of the current client being generated.</param>
    /// <returns>Simulated client IP address.</returns>
    private string CreateClientIp(UInt32 index)
    {
        index = (index << 2) + 3;
        return $"192.{(index >> 16) & 0xFF}.{(index >> 8) & 0xFF}.{index & 0xFF}";
    }

以下方法从192.0.0.3开始生成IP,增量为3。我希望有我的第一个地址192.0.0.2(避免网络地址以及第一个通常用于GW的地址)和下一个增加一。对此有什么想法吗?谢啦!


共2个答案

匿名用户

以下是避免地址以255结尾的更好代码。:

       public class IncrementIP
        {
            byte[] array = new byte[4];
            public IncrementIP(string IP)
            {
                array = IP.Split(new char[] { '.' }).Select(x => byte.Parse(x)).ToArray();
            }
            public string Increment()
            {
                int lsb = array[3] + 3;
                if (lsb <= 254)
                {
                    array[3] = (byte)lsb;
                }
                else
                {
                    array[3] = 2;
                    for (int i = 2; i >= 0; i--)
                    {
                        if (array[i] == 254)
                        {
                            array[i] = 0;
                        }
                        else
                        {
                            array[i] += 1;
                            break;
                        }
                    }
                }

                return string.Join(".", array);
            }
        }

匿名用户

我认为最简单的做法是使用IPAddress并操作用于创建它们的字节。看着你的帖子的评论,我不确定你是否需要修改以不使用255。不确定。不管怎样,这应该给你一个很好的起点。如果需要字符串形式,请在返回的IP地址上使用ToString()。

    static void Main(string[] _)
    {
        var address = IPAddress.Parse("192.0.0.2");

        foreach (var ip in GetTestAddresses(address, 300))
        {
            Console.WriteLine(ip);
        }
    }

    public static IEnumerable<IPAddress> GetTestAddresses(IPAddress start, int count)
    {
        var bytes = start.GetAddressBytes();

        for (int i = 0; i < count; ++i)
        {
            var part4 = bytes[^1];
            var part3 = bytes[^2];

            if (part4 < 255)
            {
                ++part4;
            }
            else if (part3 < 255)
            {
                part4 = 0;
                ++part3;
            }
            else
            {
                break;
            }

            bytes[^1] = part4;
            bytes[^2] = part3;

            yield return new IPAddress(bytes);
        }
    }