Пинг на Android в Unity - PullRequest
       7

Пинг на Android в Unity

0 голосов
/ 27 февраля 2019

В настоящее время я пытаюсь пропинговать другое устройство из моего приложения 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-пинг.Мне просто нужно знать, доступен ли адрес, поэтому также приветствуются альтернативные решения.

1 Ответ

0 голосов
/ 28 февраля 2019

В коммерческом проекте мы обычно отправляем сообщение с timeStamp на сервер через сокет TCP, затем получаем сообщение от сервера, в данном случае ping = (Server_timeStamp - Client_timeStamp).

...