Ping

Программирование на Юнити.

Ping

Сообщение foonk 08 окт 2010, 09:47

Всем доброго утра!

В своем проекте мне необходимо проверять доступность некоторых устройств, в документации я сразу нашел Ping, но он не дал мне желаемого результата и показался непонятным, поэтому я решил воспользоваться Ping из System.Net, который легко и просто (ИМХО) возвращает значение IPStatus.Success тру или фалс, но столкнулся со следующей проблемой: если использовать "UnityEngine", то происходит конфликт, т.к. в нем тоже есть класс Ping, а без MonoBehaviour я из другого скрипта не могу получить доступ к первому. В общем вот примерчик:
1) Тут я хочу получить статус, пингую девайс "146.27.32.11"
Синтаксис:
Используется csharp
//using UnityEngine;
using System.Collections;
using System.Net.NetworkInformation;
using System.Net;

public class PingDevice { //: MonoBehaviour {

    Ping p = new Ping();
    public bool statusOK;    
   
    public void GetDeviceStatus () {
        PingReply pr = p.Send("146.27.32.11");
        IPStatus status = pr.Status; //IPStatus.Success
        IPAddress ipAddr = pr.Address;
        long pingTime = pr.RoundtripTime;
        if(status==IPStatus.Success) {
            statusOK=true;
        }
        else {
            statusOK=false;
        }    
    }    
}


2) Тут я хочу по кнопочке запустить этот самый пинг, но не могу получить доступ к первому, так как класс не MonoBehaviour:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class TestPing : MonoBehaviour {

    public PingDevice pinger;

    void OnGUI() {
        if(GUI.Button (new Rect (20, 40, 50, 20),"Ping")){
            pinger.GetDeviceStatus();
        }
        if (pinger.statusOK == true)
            GUI.Label (new Rect (20, 0, 50, 20), "OK");
        else
            GUI.Label (new Rect (20, 0, 50, 20), "NOT OK");
    }
}    


Подскажите, пожалуйста, как достучаться в моем случае до PingDevice, или как получить статус через родной Ping
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Ping

Сообщение Kann 08 окт 2010, 11:08

попробуйте так.....
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Net.NetworkInformation;
using System.Net;

public class PingDevice : MonoBehaviour {

   System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
    public bool statusOK;    
   
    public void GetDeviceStatus () {
        PingReply pr = p.Send("146.27.32.11");
        IPStatus status = pr.Status; //IPStatus.Success
        IPAddress ipAddr = pr.Address;
        long pingTime = pr.RoundtripTime;
        if(status==IPStatus.Success) {
            statusOK=true;
        }
        else {
            statusOK=false;
        }    
    }    
}
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Ping

Сообщение DbIMok 08 окт 2010, 11:39

HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://dc228.4shared.com/download/APsimQuD/ping.unity3d&w=320&h=240&t=false&preview=1' height='"+(240+30)+"' width='320' frameborder='0' scrolling='no'></iframe>"); </script>

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Checker : MonoBehaviour {
        public string pingIP = "8.8.8.8";
        public int pingTime;
        void OnGUI () {
                GUI.Window(0, new Rect(20, 20, 200, 150), DoMyWindow, "Проверка пинга");
        }
    void DoMyWindow(int windowID) {
                GUILayout.BeginVertical();
                        GUILayout.FlexibleSpace();
                        GUILayout.BeginHorizontal();
                                GUILayout.FlexibleSpace();                             
                                pingIP = GUILayout.TextField(pingIP, 15,  GUILayout.Width(100));               
                                GUILayout.FlexibleSpace();                             
                        GUILayout.EndHorizontal();
                        GUILayout.FlexibleSpace();
                        GUILayout.BeginHorizontal();
                                GUILayout.FlexibleSpace();                             
                                if (GUILayout.Button("Пинг!", GUILayout.Width(75))) {
                                        StartCoroutine(Check());
                                }
                                GUILayout.FlexibleSpace();                             
                        GUILayout.EndHorizontal();
                        GUILayout.FlexibleSpace();
                        GUILayout.BeginHorizontal();
                                GUILayout.FlexibleSpace();                             
                                GUILayout.Label(pingTime.ToString());
                                GUILayout.FlexibleSpace();                             
                        GUILayout.EndHorizontal();                             
                        GUILayout.FlexibleSpace();
                GUILayout.EndVertical();
    }
        IEnumerator Check() {
                Ping pingTest = new Ping(pingIP);              
                while (!pingTest.isDone) yield return new WaitForSeconds(0.1f);
                pingTime = pingTest.time;
        }
}
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Ping

Сообщение Neodrop 08 окт 2010, 12:01

Дымок, у меня броузер завис от твоей демки. В логах пусто.
Может быть потому, что я не вводил адрес. :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Ping

Сообщение DbIMok 08 окт 2010, 12:31

не, адрес нормальный. поленился сразу сделать правильно, переделал. теперь не должно виснуть.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Ping

Сообщение Neodrop 08 окт 2010, 12:36

Непонятно, что происходит, когда кликаешь по кнопке (один раз выскакивает циферка). Но если покликать несколько раз, то я вот, к примеру, упал ;;)
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Ping

Сообщение DbIMok 08 окт 2010, 12:41

да все понятно там что и почему [curved_hands]
еще раз исправил
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Ping

Сообщение foonk 08 окт 2010, 12:52

Kann, спасибо, ошибка исчезла, НО :
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Net.NetworkInformation;
using System.Net;

public class PingDevice : MonoBehaviour {

   System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
    public bool statusOK;
     
    public void GetDeviceStatus () {
        IPAddress address = IPAddress.Loopback;
        PingReply reply = p.Send (address);
        IPStatus status = reply.Status;

        if(status==IPStatus.Success) {
            statusOK=true;
        }
        else {
            statusOK=false;
        }    
    }


NullReferenceException: Object reference not set to an instance of an object
PingDevice.GetDeviceStatus () (at Assets\Scripts\PingDevice.cs:13)
TestPing.OnGUI () (at Assets\Scripts\TestPing.cs:10)

Не пойму никак почему...

DbIMok, типа того я уже делал, но такой вариант к сожалению мне не подходит, так как он не может сказать твердо: да, устройство доступно или нет, устройство выключено. А в моем случае нужно именно это. Он лишь показывает время отклика.
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Ping

Сообщение DbIMok 08 окт 2010, 12:59

если ответ не придет, то время будет -1. системный вариант конечно более информативен, настраивается, может пинговать не только по адресу, но и по имени, но кому-то пригодится и такой простой примерчик реализации.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Ping

Сообщение foonk 08 окт 2010, 13:05

Дык почему же у меня не работает системный вариант то ((((
http://msdn.microsoft.com/en-us/library/hb7xxkfx.aspx
Вроде все сходится, а ругается на pingSender
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Ping

Сообщение Kann 08 окт 2010, 13:12

странно, у меня в маке оно другую ошибку выдает не связанную с юнити, глянте в инспекторе на скрипте TestPing висит ли там PingDevice
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Ping

Сообщение foonk 08 окт 2010, 13:21

Висит...
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось foonk 08 окт 2010, 13:22, всего редактировалось 1 раз.
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Ping

Сообщение Kann 08 окт 2010, 13:22

проверил на винде, все работает, вы чето где то упустили
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Ping

Сообщение foonk 08 окт 2010, 13:36

Вот засада! На Unity 3 и вправду все работает, я просто сейчас доделываю проект на 2.6.1, так как в 3 есть глюк, не собираются проекты, в которых есть System.Data, а в моем проекте без него никуда... Как же быть? На 2.6 не работает пинг, на 3 не собирается проект ((( Обидно блин :-?
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Ping

Сообщение DbIMok 08 окт 2010, 13:43

да, все должно работать. но метод синхронный, приводит к тормозам, лучше использовать SendAsync. и в вебе SecurityException: SendTo request refused by Unity webplayer security model
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7