0

I'm trying to create a code which will allow me to ping range of IP addresses.

I'm getting 2 inputs. One is address to start range from and the other is the end of the IP range I want to ping. Then I'm splitting a string and assigning the values of each to variables that will change (a, b, c, d, aa, bb, cc, dd).

Is this logically correct?

This is my code:

public PingIPRange()
{
    InitializeComponent();

    txtFrom.Text = "250.250.250.250";
    txtTo.Text = "254.254.224.254";

    string[] from = txtFrom.Text.Split('.');
    string[] to = txtTo.Text.Split('.');

    int from1 = a = int.Parse(from[0]);
    int from2 = b = int.Parse(from[1]);
    int from3 = c = int.Parse(from[2]);
    int from4 = d = int.Parse(from[3]);

    int to1 = aa = int.Parse(to[0]);
    int to2 = bb = int.Parse(to[1]);
    int to3 = cc = int.Parse(to[2]);
    int to4 = dd = int.Parse(to[3]);

    tmrPingInterval.Tick += new EventHandler(tmrPingInterval_Tick);
}

void tmrPingInterval_Tick(object sender, EventArgs e)
{
    if (d <= max)
    {
        if (d == max || d == dd)
        {
            c++;
            d = 0;
        }
        if (c == max || c == cc)
        {
            d++;
            c = 0;
        }
        if (b == max || b == bb)
        {
            c++;
            b = 0;
        }
        if (a == max || a == aa)
        {
            b++;
            a = 0;
        }

        if ((a == max && b == max && c == max && d == max) || (a == aa && b == bb && c == cc && d == dd))
        {
            tmrPingInterval.Stop();
        }

        txtDisplay.Text += a + "." + b + "." + c + "." + d + Environment.NewLine;

        d++;
    }

    txtDisplay.SelectionStart = txtDisplay.Text.Length;
    txtDisplay.ScrollToCaret();
}
HelpNeeder
  • 6,383
  • 24
  • 91
  • 155

2 Answers2

2

You're overcomplicating it! I'd keep it simple with something like this:

static uint str2ip(string ip)
{
    string[] numbers = ip.Split('.');

    uint x1 = (uint)(Convert.ToByte(numbers[0]) << 24);
    uint x2 = (uint)(Convert.ToByte(numbers[1]) << 16);
    uint x3 = (uint)(Convert.ToByte(numbers[2]) << 8);
    uint x4 = (uint)(Convert.ToByte(numbers[3]));

    return x1 + x2 + x3 + x4;
}

and

static string ip2str(uint ip)
{
    string s1 = ((ip & 0xff000000) >> 24).ToString() + "."; 
    string s2 = ((ip & 0x00ff0000) >> 16).ToString() + ".";
    string s3 = ((ip & 0x0000ff00) >> 8).ToString() + "."; 
    string s4 = (ip & 0x000000ff).ToString();

    string ip2 = s1 + s2 + s3 + s4;
    return ip2;
}

Here's an example:

static void Main(string[] args)
{
    uint startIP = str2ip("250.255.255.100");
    uint endIP = str2ip("255.0.1.255");

    for(uint currentIP = startIP; currentIP <= endIP; currentIP++) {
        string thisIP = ip2str(currentIP);
        Console.WriteLine(thisIP);
    }

    Console.ReadKey();
}
BlackBear
  • 22,411
  • 10
  • 48
  • 86
  • This looks nice as an example. I will give a feedback when I try to use your code. – HelpNeeder Jan 18 '12 at 21:15
  • Clever but I wouldn't call this simple. The concepts of bit shifting and encoding four bytes into an unsigned integer would be strange to many prorgrammers, I fear. – Igby Largeman Jan 18 '12 at 21:28
  • @Igby Largeman, I do kind of agree. But the concept is easy to wrap around. The only difficult part here is the conversion to uint and vice versa. – HelpNeeder Jan 18 '12 at 21:40
1

I recommend you to use a class IPAddress. Than you can iterate through IP addresses using this code:

IPAddress ipAddress = IPAddress.Parse(txtFrom.Text);

byte[] bytes = ipAddress.GetAddressBytes();
if (++bytes[3] == 0)
  if (++bytes[2] == 0)
    if (++bytes[1] == 0)
        ++bytes[0];

IPAddress nextIPAddress = new IPAddress(bytes);

Source: ip address increment problem

Community
  • 1
  • 1
Marek Takac
  • 1,105
  • 7
  • 11