ip地址增量问题

时间:2010-08-14 12:20:57

标签: c# ip-address ip

我想增加我的IP地址;

这是代码

 ipAddressControl1.Text = "192.168.1.255";

 byte[] ip = ipAddressControl1.GetAddressBytes();
 ip[3] = (byte)(++ip[3]);

 IPAddress ipAddress1 = new IPAddress(ip);
 MessageBox.Show(ipAddress1.ToString());

或者我也试过这个

ipAddressControl3.Text = "192.168.1.255";
 IPAddress ipAddress1 = new IPAddress(ıpAddressControl3.GetAddressBytes());
 ipAddress1.Address += 0x1 << 24;
 MessageBox.Show(ipAddress1.ToString());

但是他们两个都给了我192.168.1.0但我想得到192.168.2.0的价值

7 个答案:

答案 0 :(得分:8)

您的问题是,当ip[2]回绕时,您不会增加ip[3](依此类推)。以下代码应该可以解决问题,最后从255.255.255.255换行到0.0.0.0

byte[] ip = ipAddressControl1.GetAddressBytes();
ip[3] = (byte)(ip[3] + 1);
if (ip[3] == 0) {
    ip[2] = (byte)(ip[2] + 1);
    if (ip[2] == 0) {
        ip[1] = (byte)(ip[1] + 1);
        if (ip[1] == 0) {
            ip[0] = (byte)(ip[0] + 1);
        }
    }
}

以下内容也可能有效:

byte[] ip = ipAddressControl1.GetAddressBytes();
if (++ip[3] == 0)
    if (++ip[2] == 0)
        if (++ip[1] == 0)
            ++ip[0];

答案 1 :(得分:2)

值得注意的是,现有的答案都没有处理IPv6地址,IPAddress类本身确实需要这些地址。为此,您可能希望采用更一般的策略(我不确定IPv6的增量规则是什么样的,尽管它们可能完全相同,只需要更多的字节来完成它,我怀疑是案件)。

- 编辑:

在此基础上,这似乎有效:

    public static IPAddress Increment (IPAddress address)
    {
        IPAddress result;

        byte[] bytes = address.GetAddressBytes();

        for(int k = bytes.Length - 1; k >= 0; k--){
            if( bytes[k] == byte.MaxValue ){
                bytes[k] = 0;
                continue;
            }

            bytes[k]++;

            result = new IPAddress(bytes);
            return result;
        }

        // Un-incrementable, return the original address.
        return address;
    }

答案 2 :(得分:1)

您需要检查您的地址是否为254 - 255且0是广播地址。

ipAddressControl1.Text =“192.168.1.255”;

byte[] ip = ipAddressControl1.GetAddressBytes();
if (ip[3] != 255)
{
    ip[3] = (byte)(++ip[3]);
}
else
{
    ip[2] = (byte)(++ip[2]);
    ip[3] = (byte)0;
}
IPAddress ipAddress1 = new IPAddress(ip);
MessageBox.Show(ipAddress1.ToString());

但是你只能检查到溢出到ip [0] - 如果你在那里达到255就需要小心。

答案 3 :(得分:1)

在第一个示例中,您只是递增第4个字节序列。因此它将从255变为0而对字节[2]没有影响。

在第二个序列中,你将它递增1,然后你将它从2转换回1.我不确定你为什么选择这样做。

答案 4 :(得分:0)

看起来IP地址在您尝试使用的.Address属性中以“错误的方式”存储:

192.168.1.255
 c0 a8 01 ff     is stored as   0xff01a8c0

因此,添加1 << 24只会增加左侧的0xff,然后将其截断,并将其转换为0

如果您希望按照您描述的方式工作,则必须编写自己的附加功能。

public static IPAddress IncrementIP(IPAddress addr)
{
    byte[] ip = addr.GetAddressBytes();
    ip[3]++;
    if (ip[3] == 0) {
        ip[2]++;
        if (ip[2] == 0) {
            ip[1]++;
            if (ip[1] == 0)
                ip[0]++;
        }
    }
    return new IPAddress(ip);
}

或类似的东西。

答案 5 :(得分:0)

您可以将IP转换为其等效数字。

查看此前已回答的问题以获取详细信息:

Best type for IP-address in Hibernate Entity?

public static string GetStandardIP(long numericIP)
    {
        string w = Convert.ToString(Convert.ToInt64(numericIP / 16777216) % 256);
        string x = Convert.ToString(Convert.ToInt64(numericIP / 65536) % 256);
        string y = Convert.ToString(Convert.ToInt64(numericIP / 256) % 256);
        string z = Convert.ToString(Convert.ToInt64(numericIP) % 256);

        return w + "." + x + "." + y + "." + z;
    }

这一个

public static long GetNumericIP(string standardIP)
    {
            if (standardIP != null && standardIP != string.Empty)
            {
                string[] ipParts = standardIP.Split('.');
                long numericIP = 16777216 * Convert.ToInt64(ipParts[0]) + 65536 * Convert.ToInt64(ipParts[1]) + 256 * Convert.ToInt32(ipParts[2]) + Convert.ToInt32(ipParts[3]);

                return numericIP;
            }
            return 0;
    }

您可能希望通过检查参数来改进它们并使用string.concat

答案 6 :(得分:0)

我强烈不同意所提供的答案。它肯定有效,但我可以看到它的严重问题,从可读性开始。在我看来,可读性和可维护性是至关重要的,并且接受的解决方案根本不会这样做。除此之外,更通用的方法也将解决IPv6的问题,而接受的解决方案将无法工作。

我的建议是使用以下方法:

    public static IPAddress AddOne(this IPAddress ipAddress)
    {
        byte[] data = ipAddress.GetAddressBytes();

        IncrementByOneFromRight(data, data.Length - 1);

        return new IPAddress(data);
    }

    private static void IncrementByOneFromRight(byte[] data, int index)
    {
        if (index < 0)
            return;

        if (data[index] < byte.MaxValue)
            data[index] += 1;
        else
        {
            data[index] = 0;

            IncrementByOneFromRight(data, index - 1);
        }
    }

将上述内容放在可见的静态类中,AddOne方法将作为IPAddress的扩展方法。这使得它更容易使用,并且您不会暴露在您的类中添加到IPAddress的细节实现细节,同时保持和可读性。这将带来额外的好处,即不会使用可能不相关的方法编写的类混乱。

如果您同意我的回答以及我不同意批准的原因,请立即投票通知这个问题。