суббота, 20 ноября 2010 г.

Пинг в .Net доменных адресов из зоны РФ

Вводная - есть программа пингер. Всё нормально работает, но вот с доменными адресами на кириллице работать не хочет (кстати стандартный ping тоже с ними не работает)

То есть код вида

Ping ping = new Ping();
PingReply pr = ping.Send(IPadress);


* This source code was highlighted with Source Code Highlighter.


Работать к сожалению не будет.

Вот пример, как это обойти и спокойно пинговать адреса .рф




Для начала создадим окно примерно следующего вида -


Добавим

using System.Globalization;

* This source code was highlighted with Source Code Highlighter.

Далее повесим на кнопку Ping обработчик нажатия

    private void btnPing_Click(object sender, EventArgs e)
    {
      //Проверяем введен ли какой либо домен
      if (txtDomain.Text != null && txtDomain.Text != "")
      {
        IdnMapping idn = new IdnMapping();
        //Тестовое окно сообщения выводящие домен после преобразования
        MessageBox.Show("Доменное имя в IDN кодировке - " + idn.GetAscii(txtDomain.Text), "Доменное имя в IDN кодировке", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

        try
        {
          //собствено сам пинг
          Ping p = new Ping();
          PingReply pr = p.Send(idn.GetAscii(txtDomain.Text));
       
          txtAnswer.Text += txtDomain.Text + " - " + pr.Address.ToString() + ", " + pr.Status + Environment.NewLine;
        }
        //Обработка исключения пинга
        catch (PingException)
        {
          txtAnswer.Text += "Пинг " + txtDomain.Text + " не удачен" + Environment.NewLine;
        }
      }
      else
      {
        txtAnswer.Text += "Введите имя домена для пинга!!!" + Environment.NewLine;
      }
    }


* This source code was highlighted with Source Code Highlighter.

 Теперь можем компилировать. В результате получим следующее (последовательно пинговал - "", "президент", "президент.рф" и "kremlin.ru") -


В принципе код не имеет противопоказаний. То есть, если домен латинский (ru, com, org и тд), он вернётся как есть. Так что лучше всегда добавлять в сетевой код.