Ping Master - трансляция cmd2html на ASP Владимир Егоров aka Dr.NET Спецвыпуск Xakep, номер #030, стр. 030-050-5 В методе "send_echo" создаем низкоуровневый сокет для протокола ICMP. Задаем массив байт, содержащий наш IP-пакет без задания IP-адресов отправителя и получателя. После этого добавляем в массив последовательно 8 байт IP-адресов отправителя и получателя. Как выделить эти байты, показано в листинге. using System; using System.Net; using System.Net.Sockets; using System.Text.RegularExpressions; namespace Custom { public class Ping { protected static ushort checksum_ip(byte[] buffer) { ulong cksum = 0; int hdr_length = (buffer[0]&0x000f)*4; for (int i = 0; i<hdr_length;i+=2) cksum+=(ulong)((buffer[i]<<8)+buffer[i+1]); cksum = (cksum>>16)+(cksum&0xffff); cksum+=(cksum>>16); return ((ushort)~cksum); } public static bool send_echo(IPAddress ip_to, int timeout) { Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp); IPEndPoint ep = new IPEndPoint(ip_to,0); byte[] data = {69,0,0,28,2,134,0,0,128,1, 0,0, 0,0,0,0, 0,0,0,0, 8,0,176,255,1,0,70}; data[19] = (byte)(ip_to.Address>>24); data[18] = (byte)((ip_to.Address>>16)&0x00ff); data[17] = (byte)((ip_to.Address>>8)&0x0000ff); data[16] = (byte)(ip_to.Address&0x000000ff); ushort check = checksum_ip(data); data[10] = (byte)(check>>8); data[11] = (byte)(check&0x00ff); socket.SendTo(data,ep); return (socket.Poll(timeout,SelectMode.SelectRead)); } public static void Main(string[] address) { IPAddress rcpt_ip = IPAddress.None; Regex rx = new Regex(@"(\d{1,3}.){3}(\d{1,3}){1}"); if (rx.Match(address[0]).Success) rcpt_ip = IPAddress.Parse(address[0]); else rcpt_ip = Dns.GetHostByName(address[0]).AddressList[0]; if (Ping.send_echo(rcpt_ip,5000000)) Console.WriteLine("Требуемый хост доступен"); else Console.WriteLine("Требуемый хост недоступен"); } } } После этого отправляем пакет получателю и ждем ответа "timeout" микросекунд. Процедура "Main" получает в качестве параметра IP-адрес или DNS-имя компа и преобразует DNS-имя в IP-адрес с помощью метода "Dns.GetHostByName". Я не стал проверять вводимые данные, так как наша ASPX-страница уже это делает, и при обращении к проге из этой страницы все адреса уже должны быть в подходящем формате (но учти, если использовать прогу отдельно от нашей ASP.NET-страницы, то проверку форматов провести нужно обязательно). В конце, используя метод "send_echo", посылаем запрос, ждем 5 секунд и пишем, доступен хост или нет. Осталось откомпилировать эту программу. Делается это с помощью компилятора C# "csc.exe" следующим образом: "csc.exe /t:exe /out:ping.exe ping.cs" (разумеется, без кавычек и при условии, что "ping.cs" лежит там же, где и "csc.exe", а если нет, то пишем полный путь к файлу кода). После компиляции изменяем "FileName" и "Arguments" в ASP.NET-странице и юзаем. |