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")) |
Работает? Работает!
Правда, есть несколько "но":
- На экране появляется окно-аналог cmd. Ненадолго, но все же это не совсем гуд.
- Результирующий файл надо будет потом анализировать на предмет "чего же там есть". Учитывая, что мне надо было просто проверить "есть ресурс или нет", работа по разбору и аналитике выглядит немного лишней
Остается третий (и пока последний) вариант - написать собственный аналог 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-коду приветствуются
Спасибо Евгению Елпанову, исправил одну досадную ошибку