Как на C# Получить список ip из диапазона ?

Есть форма на ней есть 4 элемента Edit1 (Начальный диапазон) Edit2 (Конец диапазона) Edit3 (Вывод списка ip)
Button1 кнопка для старта.

Как мне сделать чтобы с диапазона выводило список ip-шников.
Как не крутил ничего не получается, а пробовал с консольного исходника:
using System;
using System.Linq;
using System.Net;
 
namespace _1037965
{
    class Program
    {
        static void Main()
        {
            var beginIp = GetIp("Введите начальный ip: ");
            var endIp = GetIp("Введите конечный ip: ");
            for (var value = beginIp; value <= endIp; value++)
            {
                var ipBytes = BitConverter.GetBytes(value).ToList();
                ipBytes.Reverse();
                var ip = new IPAddress(ipBytes.ToArray());
                Console.WriteLine(ip);
            }
            Console.ReadLine();
        }
 
        private static uint GetIp(string text)
        {
            Console.Write(text);
            string strBeginIp = Console.ReadLine();
            var bytesIp = IPAddress.Parse(strBeginIp).GetAddressBytes().ToList();
            bytesIp.Reverse();
            return BitConverter.ToUInt32(bytesIp.ToArray(), 0);
        }
    }
}
  • Вопрос задан
  • 4987 просмотров
Пригласить эксперта
Ответы на вопрос 2
StrangeAttractor
@StrangeAttractor
Попробуй так:

private static List<IPAddress> IPAddressesRange(IPAddress firstIPAddress, IPAddress lastIPAddress)
{
    var firstIPAddressAsBytesArray = firstIPAddress.GetAddressBytes();

    var lastIPAddressAsBytesArray = lastIPAddress.GetAddressBytes();

    Array.Reverse(firstIPAddressAsBytesArray);

    Array.Reverse(lastIPAddressAsBytesArray);

    var firstIPAddressAsInt = BitConverter.ToInt32(firstIPAddressAsBytesArray, 0);

    var lastIPAddressAsInt = BitConverter.ToInt32(lastIPAddressAsBytesArray, 0);

    var ipAddressesInTheRange = new List<IPAddress>();

    for (var i = firstIPAddressAsInt; i <= lastIPAddressAsInt; i++)
    {
        var bytes = BitConverter.GetBytes(i);

        var newIp = new IPAddress(new[] {bytes[3], bytes[2], bytes[1], bytes[0]});

        ipAddressesInTheRange.Add(newIp);
    }

    return ipAddressesInTheRange;
}


Преобразовать текстовую строку в IPAddress (чтобы подать на вход вышеприведённой функции) можно так:

var ipAddres = System.Net.IPAddress.Parse(ipString);


(подразумевается, что переменная ipString имеет тип string и содержит IP адрес в текстовой нотации).

Пример использования (при нажатии на кнопку button1 считаем диапазон от 192.168.0.1 до 192.168.0.10 и выкладываем в заголовок формы второй адрес из полученного диапазона):

private void button1_Click(object sender, EventArgs e)
{
    var first = "192.168.0.1";

    var last = "192.168.0.10";

    var range = IPAddressesRange(IPAddress.Parse(first), IPAddress.Parse(last));

    Text = range[1].ToString();
}


Консольные проги на C# никогда не писал (как-то так исторически сложилось, под консоль писал на других языках) так что вопрос ввода данных предлагаю отладить Вам самому, а что делать далее когда Вы получили первый и последний IP в строковом формате надеюсь понятно их последнего примера (если нет - дайте знать).

UPDATE: Т.к. вопрошающему, судя по комментам, не помогло, добавляю полный код рабочей WinForms-программы:

using System;
using System.Collections.Generic;
using System.Net;
using System.Windows.Forms;

namespace IpRange
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void goButton_Click(object sender, EventArgs e)
        {
            IPAddress firstIpAddress;

            IPAddress lastIpAddress;

            if (String.IsNullOrWhiteSpace(firstIpAddressTextBox.Text))
            {
                MessageBox.Show("Не задан начальный IP-адрес диапазона", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return;
            }

            if (String.IsNullOrWhiteSpace(lastIpAddressTextBox.Text))
            {
                MessageBox.Show("Не задан начальный IP-адрес диапазона", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return;
            }

            try
            {
                firstIpAddress = IPAddress.Parse(firstIpAddressTextBox.Text);
            }
            catch (FormatException)
            {
                MessageBox.Show("Неправильно задан финальный IP-адрес диапазона", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return;
            }

            try
            {
                lastIpAddress = IPAddress.Parse(lastIpAddressTextBox.Text);
            }
            catch (FormatException)
            {
                MessageBox.Show("Неправильно задан финальный IP-адрес диапазона", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return;
            }

            var range = IPAddressesRange(firstIpAddress, lastIpAddress);

            wholeRangeListBox.Items.Clear();

            wholeRangeListBox.Items.AddRange(range.ToArray());

            // Или так (*вместо* предыдущей строчки - ту убрать, эту разкомментировать):
            // foreach (var ipAddress in range) wholeRangeListBox.Items.Add(ipAddress);
        }

        private static List<IPAddress> IPAddressesRange(IPAddress firstIPAddress, IPAddress lastIPAddress)
        {
            var firstIPAddressAsBytesArray = firstIPAddress.GetAddressBytes();

            var lastIPAddressAsBytesArray = lastIPAddress.GetAddressBytes();

            Array.Reverse(firstIPAddressAsBytesArray);

            Array.Reverse(lastIPAddressAsBytesArray);

            var firstIPAddressAsInt = BitConverter.ToInt32(firstIPAddressAsBytesArray, 0);

            var lastIPAddressAsInt = BitConverter.ToInt32(lastIPAddressAsBytesArray, 0);

            var ipAddressesInTheRange = new List<IPAddress>();

            for (var i = firstIPAddressAsInt; i <= lastIPAddressAsInt; i++)
            {
                var bytes = BitConverter.GetBytes(i);

                var newIp = new IPAddress(new[] {bytes[3], bytes[2], bytes[1], bytes[0]});

                ipAddressesInTheRange.Add(newIp);
            }

            return ipAddressesInTheRange;
        }
    }
}


Обратите внимание, что програма "окультурена", что выражается не только в проверке входных значений на пустоту и обработке неожиданного ввода исключениями, но и использованием информативных имён для элементов: главную форму я по обыкновению переименовываю из Form1 в MainForm, кнопка переименована из button1 в goButton, текстовые поля для ввода - firstIpAddressTextBox и lastIpAddressTextBox, список для вывода - wholeRangeListBox - надеюсь это не доставит дополнительных трудностей с использованием этого кода.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
ip адрес представляет собой 4 октета бит (4 байта), так что для начала загоните IP адреса в int32. Затем простым инкрементом в цикле.

string from = textEdit1.Text;
string to = textEdit2.Text;
// todo: нужно хэндлить исключения так как пользователь может ввести чушь
int ipFrom = BitConverter.ToInt32(IPAddress.Parse(from).GetAddressBytes(), 0);
int ipTo = BitConverter.ToInt32(IPAddress.Parse(to).GetAddressBytes(), 0);

IEnumerable<int> ipRange = Enumerable.Range(ipFrom, ipTo);


что бы перевести int обратно в string можно опять же сделать так:
string address = new IPAddress(BitConverter.GetBytes(intAddress)).ToString();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы