Пинг всех девайсов в локальной сети, варианты?

Сеть в Unity3D

Пинг всех девайсов в локальной сети, варианты?

Сообщение IDoNotExist 04 фев 2019, 10:50

В общем цель - получить IP адреса всех девайсов и их имена в домашней локальной сети.
Путём быстрого гугления попробовал вариант пинга через System.Net.NetworkInformation.Ping:
Синтаксис:
Используется csharp
using NetPing = System.Net.NetworkInformation.Ping;

                public IEnumerator ScanVar2()
                {
                        string subnet = "192.168.0.";

                        for (int i = 1; i < 255; i++)
                        {
                                string sAddress = subnet + i.ToString();
                                Debug.Log(sAddress);

                                try
                                {
                                        IPAddress addr = IPAddress.Parse(sAddress);

                                        NetPing ping = new NetPing();
                                        PingReply reply = ping.Send(addr, 900);

                                        if (reply.Status != IPStatus.Success)
                                                continue;

                                        IPHostEntry host = Dns.GetHostEntry(addr);
                                        Debug.Log("HOST: " + sAddress + "; " + host.HostName);
                                }
                                catch (System.Exception ex) { Debug.LogException(ex); }

                                yield return null;
                        }
                }
 


В результате получаю ошибку:
ArgumentException: The IPEndPoint was created using InterNetworkV6 AddressFamily but SocketAddress contains InterNetwork instead, please use the same type.
System.Net.IPEndPoint.Create (System.Net.SocketAddress socketAddress)


Какого фига он пытается создать сокет с IP6 адресом, когда я явно задаю ему ip4 адрес мне категорически не понятно, как это победить в гугле не нашел.

Ладно, вроде бы фигня вопрос, обнаружил что в Unity имеется свой класс Ping.
Попробовал:
Синтаксис:
Используется csharp
               
                //======================================================================================
                public IEnumerator ScanVar1()
                {
                        string subnet =  "192.168.0.";

                        for (int i = 1; i < 255; i++)
                        {
                                string sAddress = subnet + i.ToString();
                                Debug.Log(sAddress);

                                yield return TryPing(sAddress, 2000, delegate(UnityEngine.Ping ping)
                                {
                                        try
                                        {
                                                Debug.LogError(ping.time);
                                                IPAddress addr = IPAddress.Parse(sAddress);
                                                IPHostEntry host = Dns.GetHostEntry(addr);
                                                Debug.Log("HOST: " + sAddress + "; " + host.HostName);
                                        }
                                        catch (System.Exception ex) { Debug.LogException(ex); }

                                });

                                yield return null;
                        }
                }

                //======================================================================================
                private IEnumerator TryPing(string sAddr, int timeout, System.Action<UnityEngine.Ping> onDone)
                {
                        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                        sw.Start();

                        UnityEngine.Ping ping = new UnityEngine.Ping(sAddr);

                        while (!ping.isDone)
                        {
                                if (sw.ElapsedMilliseconds > timeout)
                                        break;

                                yield return null;
                        }

                        if (ping.isDone)
                                onDone(ping);
                }
 


Пинг идёт, результат возвращается НО! Только со всех ПК в сети, мобилки не пингуются, подозреваю что в них по дефолту заблочено нечто связанное с ICMP протоколом. Плюс, через Dns.GetHostEntry(addr), возвращается некорректное сетевое имя (представляет из себя IP а не имя ПК). Как всё это победить, знает кто?
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1362
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Пинг всех девайсов в локальной сети, варианты?

Сообщение seaman 04 фев 2019, 19:08

1. Что за NetPing? Может Ping?
2. У меня другая ошибка с Ping, которая связана с уровнем доступа. При запуске от админа - ошибок нет.
3. Посмотри это может поможет.
4. Имя хоста получить не удалось :(

Да, мобилки пингуются.
seaman
Адепт
 
Сообщения: 7838
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Пинг всех девайсов в локальной сети, варианты?

Сообщение IDoNotExist 04 фев 2019, 22:06

seaman писал(а):1. Что за NetPing? Может Ping?

using NetPing = System.Net.NetworkInformation.Ping;

seaman писал(а):2. У меня другая ошибка с Ping, которая связана с уровнем доступа. При запуске от админа - ошибок нет.
3. Посмотри это может поможет.

В общем то проблему в эксепшеном решил путём отключения ip6 протокола в свойствах сетевого адаптера, но один фиг мобилки не пингуются, пошел другим путём, а именно:
Скачал приложение которое это умеет, и посмотрел через Wireshark какие пакеты приходят на ПК, в общем то ICMP не приходят, а приходят ARP и NBNS, получается смысл почти тот же самый, вместо пинга - ARP, а вместо Dns.GetHostEntry - NBNS. Проблема в том, что в .NET насколько я понял, из быстрого гугления, не так просто отправить пакеты этих протоколов, либо с помощью дополнительных библиотек, либо с помощью костылей, буду гуглить дальше.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1362
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Пинг всех девайсов в локальной сети, варианты?

Сообщение Woolf 04 фев 2019, 22:13

но один фиг мобилки не пингуются

Только хотел сказать, что ICMP на мобилках и не будет работать, но вы уже сами разобрались.
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Аватара пользователя
Woolf
Адепт
 
Сообщения: 6833
Зарегистрирован: 02 мар 2009, 16:59

Re: Пинг всех девайсов в локальной сети, варианты?

Сообщение seaman 04 фев 2019, 23:01

ICMP на мобилках и не будет работать

Не знаю что там будет, не будет работать, но мой андроид спокойно по wifi пингуется. И встроенным пингом из командной строки и Ping .NET
Скрипт:
https://pastebin.com/zYHi21kd
Запускать Юнити надо "от другого пользователя" - Администратор
seaman
Адепт
 
Сообщения: 7838
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Пинг всех девайсов в локальной сети, варианты?

Сообщение IDoNotExist 05 фев 2019, 09:15

seaman писал(а):Не знаю что там будет, не будет работать, но мой андроид спокойно по wifi пингуется. И встроенным пингом из командной строки и Ping .NET
Скрипт:
https://pastebin.com/zYHi21kd

Во, та мобилка на которую установил Fing, начала пинговаться, но другая, на которой его нет один фиг не пингуется, обе мобилки Xiaomi, да в общем то ICMP не самый удачный вариант, если его отключить в винде на ПК, то он уже не пингуется, но Fing его всё-равно находит.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1362
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Пинг всех девайсов в локальной сети, варианты?

Сообщение Cr0c 13 фев 2019, 17:07

IDoNotExist писал(а):Теперь могу получать с ПК на Windows, корректное имя, мак адрес, рабочую группу и т.д., как получить то же самое с Андроид и Мак девайсов, еще разбираюсь...

служба имён NetBIOS
действительно странно, что в мобилках этого нет (сарказм)
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 2968
Зарегистрирован: 19 июн 2015, 13:50
Skype: i_cr0c

Re: Пинг всех девайсов в локальной сети, варианты?

Сообщение IDoNotExist 13 фев 2019, 17:46

Cr0c писал(а):
служба имён NetBIOS
действительно странно, что в мобилках этого нет (сарказм)

Не понял если честно к чему тут ваш сарказм, про NetBIOS я в курсе, умею в гугл и в википедию. По существу комментарии будут? Какие запросы и для какого протокола нужны для Андроида и Мака?
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1362
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Пинг всех девайсов в локальной сети, варианты?

Сообщение IDoNotExist 01 мар 2019, 10:43

В общем думаю можно подвести окончательный итог:
Поиск по протоколам для мобилок, которые умеют то, что умеет NetBIOS для Windows, ничего не дал, сомневаюсь что он вообще существует на нативном уровне.
Но! Зато я нашел вариант, как получить производителя мобилки по мак-адресу, для этого после пинга мобилки, надо зачитать ARP кэш на локальном девайсе, из него вытащить мак-адрес, и послать Web - запрос на сайт вроде этого https://macvendors.com/, очевидный недостаток в том - что требуется подключение к интернету, но в принципе это можно победить, локально закэшировав небольшую базу мак-адресов.

З.Ы. Пинг от производителей Unity - полная фигня, в конце концов он у меня перестал пинговать даже ПК, в финальном варианте использовал пинг из .NET, всё отлично пингуется и мобилки и ПК.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1362
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4