Свистеть.SendAsync() возвращается повтор от 0.0.0.0, как сделать пингуется адрес?
У меня проблема с пингом.Функция SendAsync () в C#.
Я пингую некоторые ip-адреса, но некоторые из них неверны. Мне нужно удалить неправильные адреса из списка. Но как, потому что p_pingcompleted событие args.переигрывать.адрес является 0.0.0.0?
Вот мой код:
System.Collections.Generic.List<Game> GameList = new System.Collections.Generic.List<Game>();
System.Timers.Timer timer = new System.Timers.Timer(5000);
public StartServer()
{
this.tcpListener = new TcpListener(IPAddress.Any, 8888);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
Console.WriteLine("Master server running...");
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Game[] games = GameList.ToArray();
foreach (Game curgame in games)
{
System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
p.PingCompleted += new System.Net.NetworkInformation.PingCompletedEventHandler(p_PingCompleted);
p.SendAsync(IPAddress.Parse(curgame.IP), new object());
}
SendMessageToAll(output);
Console.WriteLine("Timer.Elapsed with data [" + output + "]");
}
void p_PingCompleted(object sender, System.Net.NetworkInformation.PingCompletedEventArgs e)
{
Console.WriteLine("Ping reply from: " + e.Reply.Address.ToString() + " has " + e.Reply.RoundtripTime.ToString() + " ms.");
if (e.Reply.RoundtripTime == 0 ||
e.Reply.RoundtripTime >= 2500)
{
Console.WriteLine(" Removing this server because ping is 0 or is greater than 2500 ms");
}
}
И вывод:
Pinging 16.5.4.3...
Ping reply from: 0.0.0.0 has 0 ms.
3 ответов:
Вы могли бы использовать
UserStateсвойство и блокировка для обеспечения сериализованного доступа кGameList:byte[] buffer = Encoding.ASCII.GetBytes (new string('a', 32)); var options = new PingOptions (32, true); Ping p = new Ping(); p.PingCompleted += p_PingCompleted; foreach (Game curgame in GameList.ToArray()) { // e.UserState will be curgame p.SendAsync(IPAddress.Parse(curgame.IP), 2500, buffer, options, curgame); }Затем в вашем
p_PingCompletedобработчике:void p_PingCompleted(object sender, PingCompletedEventArgs e) { var game = (Game)e.UserState; if (e.Reply.Status != IPStatus.Success) { Console.WriteLine( " Could not reach {0} ({1}), removing this server...", game.IP, e.Reply.Status); lock (GameList) { GameList.Remove(game); } } else { Console.WriteLine( "Ping reply from: {0} in {1} ms", e.Reply.Address, e.Reply.RoundtripTime); if (e.Reply.RoundtripTime == 0 || e.Reply.RoundtripTime >= 2500) { Console.WriteLine(" Ping too high, removing this server..."); lock (GameList) { GameList.Remove(game); } } } }
В асинхронном вызове отправьте объект Ping (или игровой объект, с каким бы списком вы ни имели дело) в качестве состояния объекта, а затем из события ping completed просто удалите этот объект из списка, если адрес неверен.
Я думаю, что это должно делать, как вы используете
SendAsync(string, object).В MSDN есть довольно хороший пример. Вместо этого используйте
SendAsync(String, Int32, Byte[], PingOptions, Object)илиSendAsync(IPAddress, Int32, Byte[], PingOptions, Object). Следуйте этому примеру, и он должен работать на вас.
Comments