Самый простой способ найти бесплатный IP-адрес в текущей подсети? - PullRequest
5 голосов
/ 16 февраля 2010

Какой самый простой способ найти следующий неиспользуемый IP-адрес в локальной подсети адаптеров?

IPAddress GetNextFreeIP(NetworkInterface intface)
{
    ...?
}

Обновление
Я написал сервер BOOTP / TFTP, который можно использовать в самых разных сценариях (перекрестный кабель, небольшая частная сеть, большая корпоративная сеть). Я должен сообщить небольшой встроенной системе, что я обновляю IP-адрес, и хотел бы найти запасной для его использования ...

Ответы [ 5 ]

1 голос
/ 16 февраля 2010

Помимо запроса к DHCP-серверу, я думаю, вы могли бы выполнить широковещательный пинг в подсети и собрать ответы со всех компьютеров и просто отсортировать IP-адреса, чтобы найти следующий. Это предполагает, конечно, что все устройства находятся в режиме онлайн и отвечают на трансляции. Так что в довольно контролируемой среде это может сработать.

1 голос
/ 16 февраля 2010

Если у вас есть управляемые DHCP диапазоны IP-адресов, у вас есть экземпляр, с которым вы можете общаться - DHCP-сервер (как рекомендовал Дэвид)

Если у вас нет управляемых диапазонов IP-адресов и нет другого экземпляра, с которым вы можете общаться, то нет надежного способа определить, используется ли IP-адрес или нет. IP не предлагает такой сервис сам по себе.

0 голосов
/ 18 февраля 2010

Вы все технически правы, когда говорите, что невозможно гарантировать, что IP не используется. Но я решил пока на это положиться ...

    public static IPAddress FindNextFree(this IPAddress address)
    {
        IPAddress workingAddress = address;
        Ping pingSender = new Ping();

        while (true)
        {
            byte[] localBytes = workingAddress.GetAddressBytes();

            localBytes[3]++;
            if (localBytes[3] > 254)
                localBytes[3] = 1;

            workingAddress = new IPAddress(localBytes);

            if (workingAddress.Equals(address))
                throw new TimeoutException("Could not find free IP address");

            PingReply reply = pingSender.Send(workingAddress, 1000);
            if (reply.Status != IPStatus.Success)
            {
                return workingAddress;
            }
        }
    }
0 голосов
/ 16 февраля 2010

Из того, что я видел для встраиваемых устройств с TFTP-сервером, они загружаются с жестко заданным IP-адресом, который задокументирован. По истечении заданного периода времени (~ 3-10 секунд) загрузчик передает управление приложению, которое считывает его конфигурацию и устанавливает IP-адрес.

Если кто-то хочет использовать загрузчик для загрузки новой прошивки, он должен прочитать документацию, убедиться, что IP-адрес доступен (в той же подсети), перезагрузить устройство и TFTP приложение на устройство.

0 голосов
/ 16 февраля 2010

Короткий ответ: нельзя, как только что сказал Торстен79.

Немного более длинный ответ:

Это зависит от конфигурации вашей сети: как администратор решил распределить IP-адреса. Обычно существует сочетание назначенных вручную IP-адресов для серверов, маршрутизаторов и т. Д., А также набор назначенных DHCP-адресов для рабочих станций и т. Д.

Если вы можете поговорить с dhcp-сервером, вы можете узнать, какие адреса в зарезервированном диапазоне свободны, но для остальных адресов вы не можете найти.

Более интересный вопрос: чего вы пытаетесь достичь? Возможно, это можно реализовать по-другому?

...