Как сканировать порт, ожидающий соединения в сети - PullRequest
7 голосов
/ 08 марта 2012

В настоящее время я работаю над небольшой утилитой чата в C #.
Проблема в том, что я не могу понять, как сканировать сеть на наличие определенного порта на всех машинах.В настоящее время я использую этот метод

    IPGlobalProperties network = IPGlobalProperties.GetIPGlobalProperties();
    IEnumerable<IPEndPoint> connections = network.GetActiveTcpListeners()
                                                        .Where(x => x.Port == ConstParams.iPort);

, где ConstParams.iPort - это порт, который я хочу сканировать (6910 здесь).

Проблема в том, что возвращаемые значения являются только локальными портами, а«0.0.0.0» ip address ...

Как мне проверить все открытые порты (6910) в текущей сети?

Ответы [ 4 ]

9 голосов
/ 17 мая 2012

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

Во время запуска приложение должно транслировать / многоадресно передавать свою информацию IP / порта.Все работающие экземпляры должны ответить на это сообщение со своими данными IP / порта.Этот вид механизма обнаружения прост в реализации, и он быстрее во время выполнения и более динамичен, чем подход сканирования портов.

1 голос
/ 17 мая 2012

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

Я бы порекомендовал сделать широковещательную передачу с использованием UDP или многоадресной рассылки для обнаружения других клиентов. http://www.codeproject.com/Articles/1705/IP-Multicasting-in-C

Другим вариантом может быть наличие централизованного сервера, либо на веб-сервере (сценарий php, страница asp.net и т. Д.), Либо на веб-службе (REST), к которой клиент чата будет подключаться при запуске, POSTing своего прослушивания IP / Port, а затем, в свою очередь, получит список всех недавно объявленных IP / портов других клиентов в сети. Вы, вероятно, захотите, чтобы некоторые остались здесь, IE: клиент будет отправлять POST на страницу каждые 5 минут, если IP-адрес не будет POST в течение 10 минут, он будет удален из списка.

Чтобы получить публичный IP-адрес устройства, вы можете проверить эту страницу: http://www.whatismyip.com/faq/automation.asp

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

Получить локальный IP-адрес

Как получить IP-адрес локальной сети компьютера программно? (C #)

1 голос
/ 17 мая 2012

Вы должны рассмотреть многоадресную рассылку, но вместо того, чтобы переходить на собственную, полагаться на существующий стандарт с поддержкой библиотек, такой как mDNS: http://en.wikipedia.org/wiki/Multicast_DNS

Или, так как вы сказали C #, используя одно из его собственных решений: http://msdn.microsoft.com/en-us/library/system.net.peertopeer.aspx

0 голосов
/ 16 мая 2012

GetIPGlobalProperties возвращает только информацию о вашем локальном компьютере (см. http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ipglobalproperties.getipglobalproperties.aspx).

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

Эта статья описывает подход: http://www.dijksterhuis.org/building-a-simple-portscanner-in-c/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...