Как записать найденные ip адреса в локальной сети, в List?
Всем привет!
Я получила список доступных ip адресов в локальной сети. Мне нужно сохранить их в лист для дальнейшего использования. Но сохранить в лист через pingcomplited не получается. Как можно это сделать?
Вот часть моего кода:
Объявляю глобально
private List<string> servers = new List<string>();
После чего идёт асинхронный пинг (функция FindServers)
for (int i = 1; i < 255; i++)
{
IPAddress ip = IPAddress.Parse(ipBase + i);
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
ping.PingCompleted += p_PingCompleted;
PingOptions options = new PingOptions(64, true);
ping.SendAsync(ip, 100, buffer, options, waiter);
}
И p_PingCompleted
if (e.Reply.Status == IPStatus.Success)
{
//**в консоль выводится без проблем**
//UnityEngine.Debug.Log("Ping successed on IP: " + e.Reply.Address.ToString());
//**вот здесь пытаюсь сохранить в лист, но он всегда остаётся пустым**
servers.Add("Ping successed on IP: " + e.Reply.Address.ToString());
//продолжает главный поток
((AutoResetEvent)e.UserState).Set();
}
UPDATE: Функция ClientStart, вызывается при запуске игры
private void ClientStart()
{
FindServers();
if (servers.Count != 0)
{
for (int i = 1; i < servers.Count; i++)
UnityEngine.Debug.Log(servers[i]);
}
else
{
UnityEngine.Debug.Log("nope");
}
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Во-первых, потокобезопасность
lock (servers)
servers.Add("Ping successed on IP: " + e.Reply.Address.ToString());
Во-вторых, вы пытаетесь прочитать список до того как он будет пополнен.
Заведите счетчик
private int pingCount;
И увеличивайте его
if (e.Reply.Status == IPStatus.Success)
{
// ...
}
int count = Interlocked.Increment(ref pingCount);
if (count == 255)
{
// все пинги закончились, здесь и надо выполнять код чтения списка, или не раньше, чем вы попадете сюда
if (servers.Count != 0)
{
for (int i = 1; i < servers.Count; i++)
UnityEngine.Debug.Log(servers[i]);
}
else
{
UnityEngine.Debug.Log("nope");
}
}