Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #30, МАЙ 2003 г.

Flash Ping - ода интерфейсу

Владимир Егоров aka Dr.NET

Спецвыпуск Xakep, номер #030, стр. 030-054-2


После этого пишем стандартный раздел импорта. Импортируем 7 пространств имен: "System", "System.Web", "System.Text.RegularExpressions" (для проверки адреса), "System.Net", "System.Diagnostics" (для работы с процессами), "System.IO" (для работы с файлами и вводом-выводом данных) и "System.Text" (сам не дурак:))).

<%@ WebHandler Language="C#" Class="Ping"%>

using System;

using System.Web;

using System.Text.RegularExpressions;

using System.Net;

using System.Diagnostics;

using System.IO;

using System.Text;

public class Ping:IHttpHandler

{

public bool IsReusable

{

get {return true;}

}

public void ProcessRequest(HttpContext context)

{

string outputText;

bool OK = false;

string address = context.Request["address"];

Regex rx = new Regex(@"\w+([-.]\w+)*(\.[a-z]+)+");

if (rx.Match(address).Success) OK = true;

else try {

IPAddress.Parse(address);

OK = true;

}

catch (Exception) {OK = false;}

if (OK) {

Process p = new Process();

p.StartInfo.UseShellExecute = false;

p.StartInfo.RedirectStandardOutput = true;

p.StartInfo.FileName = "d:\\winnt\\system32\\ping.exe";

p.StartInfo.Arguments = address+" -n 1";

p.Start();

outputText = "p=\""+p.StandardOutput.ReadToEnd()+"\"";

p.WaitForExit();

p.Dispose();

}

else outputText = "p=\"Неверный адрес!\"";

FileStream fs = File.Create("D:\\Inetpub\\wwwroot\\Handler\\output.txt");

StreamWriter sw = new StreamWriter(fs,Encoding.GetEncoding(1251));

sw.Write(outputText);

sw.Close();

fs.Close();

context.Response.ContentType="text/html";

context.Response.Write("<html><head><script language=\"javascript\">self.close()</script></head></html>");

}

}

Для того чтобы сделать WebHandler, мы должны создать новый класс "Ping", который реализует интерфейс IHttpHandler, содержащийся в пространстве имен "System.Web". Интерфейс IHttpHandler содержит всего одно свойство типа bool (IsReusable) и один метод ProcessRequest(HttpContext context), который собственно и выполняет обработку запроса. Итак, создаем класс "Ping" и через двоеточие указываем, что он унаследован от интерфейса IHttpHandler. Затем создаем поле IsReusable, доступное только для чтения и содержащее значение true (данная хрень указывает, может ли другой запрос повторно использовать тот же экземпляр WebHandler'а).

Теперь реализуем метод ProcessRequest. Сначала создадим две переменные: "outputText" и "OK". В первую засунем текстовый вывод :), который будет потом записан в файл, а во вторую - показатель, все ли нормально с адресом. После этого получаем значение адреса для пинга из переменной context.Request["address"]. После этого проверяем адрес на правильность с помощью регулярного выражения "\w+([-.]\w+)*(\.[a-z]+)+", которое соответствует полному доменному имени. Проверку IP-адреса будем производить с помощью метода IPAddress.Parse(string address), перехватывая возможное при вызове этого метода исключение. Если с адресом все ОК, то осталось запустить процесс "ping.exe" и перенаправить его вывод в текстовый файл.

Назад на стр. 030-054-1  Содержание  Вперед на стр. 030-054-3