2016-05-23 4 views
-1

программно Я хотел бы получить список всех активных устройств IP в сети, используя C.Список всех устройств в подсети

Я объясню мою проблему с примером.

пример: У меня 5 устройств в сети с IP в диапазоне от

  1. устройства 10.0.0.2
  2. Устройство 10.0.0.3
  3. Устройство 10.0.0.4
  4. устройство 10.0.0.5
  5. устройство 10.0.0.6

Из моей заявки я хотел бы ge т этот список. Моя платформа - это Linux, и я использую C. В настоящее время я не использую никаких сетевых библиотек. Если некоторые библиотеки предоставляют такие утилиты, я использую их одинаково.

Прошу совета по тому же.

+0

Проблема в том, что IP никогда не был предназначен для этого. Различные инструменты используют разные методы в разных сетевых слоях, а некоторые инструменты используют множество методов, чтобы попытаться это сделать. Ни один из методов не является надежным, и некоторые конфигурации (например, частные виртуальные локальные сети) полностью помешают таким попыткам. Если ваше приложение зависит от этого, оно будет терпеть неудачу в некоторых сетях. Простое включение брандмауэра на хосте, который блокирует эхо-сигналы ICMP, не позволит вашему коду обнаружить его с помощью пингов. Глядя на таблицу MAC-адресов в коммутаторе, вы получите MAC-адреса, которые в настоящий момент знает коммутатор. –

+0

@Ron Maupin Я пытаюсь создать серверное приложение, которое будет работать на нескольких устройствах в подсети (подобно домашней сети) с выделенным портом. У меня есть приложения для клиентов, запущенные на других устройствах. Клиентское приложение должно обнаруживать активные устройства и подключаться к портам сервера. Вместо того, чтобы пытаться подключиться ко всем 255 IP-адресам, я хотел бы получить список всех активных IP-адресов, и клиент может подключиться к ним. –

+0

Нет надежного способа определить, какие другие адреса используются. Это звучит как работа для многоадресной рассылки. Вы заинтересованы, чтобы хосты подписались на определенную группу многоадресной рассылки. Используйте правильный инструмент для задания. Кстати: есть только два текущих IP: IPv4 и IPv6. Если вы имеете в виду адреса IPv4, в любой подсети может быть переменное количество адресов IPv4, но никакие подсети не имеют 255 возможных адресов. подсеть '/ 24' имеет 254, подсеть'/25' - 126, а подсеть '/ 23' - 510 возможных адресов. У более короткой маски больше хостов. Он всегда будет '((32- )^2) -2'. –

ответ

0

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

Наиболее распространенным, что не требует ничего особенного, является просто попытка подключиться к каждому хосту с использованием TCP в ожидаемой службе.

Другой метод может быть действительно отправить ICMP-первых, но не все OS'es ответить свистеть с настройками по умолчанию и т.д.

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

+0

В настоящее время я пытаюсь подключиться к каждому IP-адресу, но сканирование занимает слишком много времени. Идея «Последний способ, который может использоваться (который работает только для локальных сетей, а не через шлюз), заключается в том, что после попытки отправки пинга просмотрите таблицу ARP. Если существует действительная запись ARP, хост находится в сети, даже если ответ на пинг не получен ». выглядит многообещающим.Не могли бы вы указать мне пример кода –

+0

@PrajoshPremdas, ваш хост будет иметь только записи в своей таблице ARP для других хостов, на которые он обменивался в течение определенного периода времени; время входа в таблицу ARP. Большинство из этих методов не будут работать с IPv6, который имеет 18 446 744 073 709 551 616 возможных адресов в подсети. на миллион адресов, сканируемых в секунду, для сканирования подсети потребуется более полутора миллиардов лет. –

+0

@PrajoshPremdas Соединительный вызов можно сделать асинхронным с таймаутом (http://developerweb.net/viewtopic.php?id=3196) . ICMP ping вы можете найти несколько примеров для онлайн, случайных (https://www.cs.utah.edu/~swalton/listings/sockets/programs/part4/chap18/myping.c). Текущую таблицу ARP IPv4 можно найти здесь: «/ proc/net/arp» –

Смежные вопросы