В настоящее время я пытаюсь пропинговать другое устройство из моего приложения Unity.Я пробовал оба UnityEngine.Ping
и System.Net.Networkinformation.Ping
, но ни один из них не работает правильно на Android.UnityEngine.Ping
уже не работает в Windows, если цель не находится в той же сети (я получаю ответ от моего собственного компьютера и другого, который находится в сети Ethernet, но не от моего телефона, который находится на Wi-Fi).Я делаю получаю ответ от телефона, если я использую System.Net.Networkinformation.Ping
в Windows.
В Adroid у каждого есть разные проблемы:
UnityEngine.Ping
: без исключения, но Ping сообщает isDone
через секунду, а свойство time
равно -1
(что указывает на то, что ответа еще не было).timeout
был установлен на 45 секунд, просто чтобы быть уверенным.
UnityEngine.Ping ping = new UnityEngine.Ping(remoteIP);
float timer = 0;
while (timer <= timeout && !ping.isDone) {
timer += Time.deltaTime;
yield return null;
}
if (ping.time < 0 || ping.time >= timeout) {
//do failure stuff
} else {
//do success stuff
}
ping.DestroyPing();
System.Net.Networkinfo.Ping
: я пробовал и Send
и SendAsync
.Первый бросает InvalidOperationException
, второй немедленно вызывает обратный вызов PingCompleted
и выбрасывает NullReferenceException
.Обе версии прекрасно работают в Windows.
Отправить:
Thread pingThread = new Thread(() => {
using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping()) {
PingReply reply = ping.Send(remoteIP, Mathf.RoundToInt(timeout * 1000));
if (reply?.Status == IPStatus.Success) {
//do success stuff
} else {
//do failure stuff
}
}
});
pingThread.Start();
(Я также пытался вызвать его в главном потоке. Он сделал блок в Windows, но не сделалне на Android, и выкинул то же исключение: InvalidOperationException: No process is associated with this object.
)
SendAsync:
using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping()) {
ping.PingCompleted += (sender, args) => {
if (args.Reply.Status == IPStatus.Success) {
//do success stuff
} else {
//do failure stuff
}
};
ping.SendAsync(remoteIP, Mathf.RoundToInt(timeout * 1000));
}
NullRefereneException
брошено в строку if (args.Reply.Status == IPStatus.Success) {
.
Кто-нибудь может сказать мне, что я делаю неправильно?Или что еще я мог попробовать?
Редактировать: Это не обязательно должен быть реальный ICMP-пинг.Мне просто нужно знать, доступен ли адрес, поэтому также приветствуются альтернативные решения.