ADN Open CIS
Сообщество программистов Autodesk в СНГ

28/12/2015

ping из-под lisp

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

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

Код - Auto/Visual LISP: [Выделить]
  1. (command "_.shell" (strcat "ping -n 1 " adress-to-ping ">%Temp%\\pingres.txt"))

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

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

Код - Auto/Visual LISP: [Выделить]
  1. (acet-sys-command (strcat "ping -n 1 " adress-to-ping ">%Temp%\\pingres.txt"))

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

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

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

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

Код - C#: [Выделить]
  1. using System;
  2. using AcRt = Autodesk.AutoCAD.Runtime;
  3.  
  4. namespace kpblc
  5. {
  6.   public static class kpblcPing
  7.   {
  8.    
  9.     [AcRt.LispFunction("kpblc-ping")]
  10.     public static bool kpblc_ping(ResultBuffer args)
  11.     {
  12.       bool res = false;
  13.       if (args != null)
  14.       {
  15.         string sPingAdress = args.AsArray()[0].Value.ToString();
  16.         System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
  17.         try
  18.         {
  19.           System.Net.NetworkInformation.PingReply pingReply = ping.Send(sPingAdress);
  20.           if (pingReply.Status == System.Net.NetworkInformation.IPStatus.Success)
  21.           {
  22.             res = true;
  23.           }
  24.         }
  25.         catch { }
  26.       }
  27.       return res;
  28.     }
  29.  
  30.   }
  31.  
  32. }
  33.  



Автор: Алексей Кулик.

Обсуждение: http://adn-cis.org/forum/index.php?topic=3308

Опубликовано 28.12.2015
Отредактировано 28.12.2015 в 15:57:22