Ping из-под лиспа

Потребовалось мне тут из-под лиспа провернуть стандартный обычный ping - проверить доступность определенного ресурса...

Естественно, первое движение - это вызвать стандартный _.shell и передать соответствующую команду:

1
(command "_.shell" (strcat "ping -n 1 " adress-to-ping ">%Temp%\\pingres.txt"))

Конечно, предварительно надо удалить результирующий файл, а потом проверять его наличие.

Проблема состоит в том, что lisp не будет ждать окончания выполнения _.shell. От слова никогда. Вспомним про практически всегда установленные ExpressTools и наличие в них интересной функции acet-sys-command:

1
(acet-sys-command (strcat "ping -n 1 " adress-to-ping ">%Temp%\\pingres.txt"))

Работает? Работает!

Правда, есть несколько "но":

  1. На экране появляется окно-аналог cmd. Ненадолго, но все же это не совсем гуд.
  2. Результирующий файл надо будет потом анализировать на предмет "чего же там есть". Учитывая, что мне надо было просто проверить "есть ресурс или нет", работа по разбору и аналитике выглядит немного лишней

Остается третий (и пока последний) вариант - написать собственный аналог ping, который проверит доступность ресурса и вернет соответственно t или nil. .NET + C# + Google, пять минут экспериментов - и получаем код вида:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using AcRt = Autodesk.AutoCAD.Runtime;

namespace kpblc
{
  public static class kpblcPing
  {
   
    [AcRt.LispFunction("kpblc-ping")]
    public static bool kpblc_ping(ResultBuffer args)
    {
      bool res = false;
      if (args != null)
      {
        string sPingAdress = args.AsArray()[0].Value.ToString();
        System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
        try
        {
          System.Net.NetworkInformation.PingReply pingReply = ping.Send(sPingAdress);
          if (pingReply.Status == System.Net.NetworkInformation.IPStatus.Success)
          {
            res = true;
          }
        }
        catch { }
      }
      return res;
    }

  }

}

Может быть, недостаточно профессионально - но работает. Конструктивные предложения по .NET-коду приветствуются ;)

Размещено в .NET, Код LISP, Функции LISP · Метки: , , ,



Комментарии

Есть 1 комментарий к “Ping из-под лиспа”
  1. Кулик Алексей aka kpblc пишет:

    Спасибо Евгению Елпанову, исправил одну досадную ошибку :)

Поделитесь своим мнением


Я не робот.