ping из-под lisp
Потребовалось мне тут из-под лиспа провернуть стандартный обычный ping - проверить доступность определенного ресурса...
Естественно, первое движение - это вызвать стандартный _.shell и передать соответствующую команду:
- (command "_.shell" (strcat "ping -n 1 " adress-to-ping ">%Temp%\\pingres.txt"))
Конечно, предварительно надо удалить результирующий файл, а потом проверять его наличие.
Проблема состоит в том, что lisp не будет ждать окончания выполнения _.shell. От слова никогда. Вспомним про практически всегда установленные ExpressTools и наличие в них интересной функции acet-sys-command:
- (acet-sys-command (strcat "ping -n 1 " adress-to-ping ">%Temp%\\pingres.txt"))
Работает? Работает!
Правда, есть несколько "но":
- На экране появляется окно-аналог cmd. Ненадолго, но все же это не совсем гуд.
- Результирующий файл надо будет потом анализировать на предмет "чего же там есть". Учитывая, что мне надо было просто проверить "есть ресурс или нет", работа по разбору и аналитике выглядит немного лишней
Остается третий (и пока последний) вариант - написать собственный аналог ping, который проверит доступность ресурса и вернет соответственно t или nil. .NET + C# + Google, пять минут экспериментов - и получаем код вида:
- 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;
- }
- }
- }
Автор: Алексей Кулик.
Обсуждение: http://adn-cis.org/forum/index.php?topic=3308
Опубликовано 28.12.2015Отредактировано 28.12.2015 в 15:57:22