Путём быстрого гугления попробовал вариант пинга через 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;
}
}
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 а не имя ПК). Как всё это победить, знает кто?