Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 1 марта!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



wm_cancelmode

Сообщение посылается окну, имеющему фокус при отображении модальных форм - диалогов и сообщений об ошибках. Дает возможность окну закрыться и освобождает мышь.



Параметры:

Параметры отсутствуют.



Возвращаемое значение
Если приложение обрабатывает это сообщение, оно должно возвращать нуль.



Действие по умолчанию
Внутренний процесс завершается и мышь освобождается.



--------------------------------------------------------------------------------




wm_close

Сигнализирует, что окно или приложение закрывается.



Параметры
Параметры отсутствуют.


Возвращаемое значение
Если приложение обрабатывает это сообщение, оно должно возвращать нуль.

Действие по умолчанию
Вызывается функция DestroyWindow, уничтожающая окно.

Примечания
Приложение при обработке этого сообщения может запросить пользователя о необходимости закрывать окно и вызвать функцию DestroyWindow только при положительном ответе.




wm_getminmaxinfo

Посылается перед изменением размеров или положения окна. Обработчик сообщения может использоваться для ограничения допустимых размеров и координат положения на экране.



Параметры

MinMaxInfo - указывает на структуру типа MINMAXINFO, содержащую принятые по умолчанию пределы изменения размеров и координат положения окна. Описание этой структуры:

typedef struct tagMINMAXINFO {
POINT ptReserved;
POINT ptMaxSize;
POINT ptMaxPosition;
POINT ptMinTrackSize;
POINT ptMaxTrackSize;
} MINMAXINFO;



Поля структуры означают следующее:

ptReserved - Зарезервировано и пока не используется

ptMaxSize - Поле типа Point определяет ширину (Point.x) и высоту (Point.y) развернутого окна

ptMaxPosition - Поле типа Point определяет положения левого (Point.x) и верхнего (Point.y) краев развернутого окна

ptMinTrackSize - Поле типа Point определяет минимальную ширину (Point.x) и минимальную высоту (Point.y) окна при изменении пользователем размеров его рамки

ptMaxTrackSize - Поле типа Point определяет максимальную ширину (Point.x) и максимальную высоту (Point.y) окна при изменении пользователем размеров его рамки

Возвращаемое значение
Если приложение обрабатывает это сообщение, оно должно вернуть 0.



Пример:



Сначала нужно в частных объявлениях (после слова private) объявить процедуру обработки данного сообщения

private
{ Private declarations }
procedure WMGETMINMAXINFO (var Msg:TWMGETMINMAXINFO); message WM_GETMINMAXINFO;

В области реализации (implementation) её нужно описать так

procedure TForm1.WMGetMinMaxInfo(var Msg:TWMGetMinMaxInfo);
begin
with Msg.MinMaxInfo^ do begin
ptMinTrackSize.x:=308; {минимальная ширина окна}
ptMinTrackSize.y:=180; {минимальная высота окна}
ptMaxTrackSize.x:=400; {максимальная ширина окна}
ptMaxTrackSize.y:=250; {максимальная высота окна}
ptMaxPosition.x:=BoundsRect.Left; {максимальная позиция окна по оси Х после максимизации}
ptMaxPosition.y:=BoundsRect.top; {максимальная позиция окна по оси У после максимизации}
ptMaxSize.x:=308; {максимальная ширина окна после максимизации}
ptMaxSize.y:=180; {максимальная высота окна после максимизации}
end;
inherited;
end;




узнать, когда пользователь/программа изменили системное время [wm_timechange]

Когда меняется системное время всем окнам верхнего уровня рассылается сообщение WM_TIMECHANGE, нужен только обработчик этого сообщения.



Примерный вид модуля может быть таким: unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
private
{ Private declarations }
procedure WMTIMECHANGE(var Message: TWMTIMECHANGE); message WM_TIMECHANGE; {объявляем процедуру обработки сообщения}
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{реализация процедуры обработки сообщения}
procedure TForm1.WMTIMECHANGE(var Message: TWMTIMECHANGE);
begin
Form1.Caption := 'Time has changed'; {например, по возникновению события уведомим об этом пользователя, вывив в заголовке окна соответствующую надпись}
end;
end.




перетаскивать файлы в свою программу

Большинство программ, предназначенных для работы с текстом, предоставляют пользователю возможность перетаскивать файлы в свою программу, а мы что лысые... :-)) ...щас тоже организуем:
Подключаем модуль ShellAPI в области uses
По созданию окна [событие OnCreate] пишем такой код:
DragAcceptFiles(Handle,True);

Когда вы перетаскиваете файл на своё приложение и отпускаете кнопку мыши, Windows посылает этому окну сообщение wm_DropFiles. Сообщение сопровождается именем файла. Обработчик этого сообщения нужно включить в раздел protected класса формы. Вставьте следующий код:
protected
procedure WMDropFiles (var Msg: TMessage); message wm_DropFiles;

после

private
{ Private declarations }
public
{ Public declarations }

Далее обрабатываем сообщение:
procedure TForm1.WMDropFiles(var Msg: TMessage);
Var
FileName: array[0..256] of char;
begin
DragQueryFile(THandle(Msg.WParam),0,FileName,SizeOf(Filename));
Memo1.lines.loadfromfile(FileName);
DragFinish(THandle(Msg.WParam));
end;

Сначала а переменную FileName помещаем имя перетаскиваемого файла. Затем загружаем его в поле Memo [не забудьте его вынести :-)]



--------------------------------------------------------------------------------




как просимулировать нажатие кнопок мыши

На форму вынесите компонент TTimer и опишите его единственное событие следующим образом: procedure TForm1.Timer1Timer(Sender: TObject);
var x,y:Integer;
begin
x:=random(Screen.Width);
y:=random(Screen.Height);
sendmessage(Handle,WM_LBUTTONDOWN,MK_LBUTTON,x+y shl 16);
sendmessage(Handle,WM_LBUTTONUP,MK_LBUTTON,x+y shl 16);
end;



Для того, чтобы убедиться, что сообщения на самом деле посылаются, давайте обработаем событие OnMouseDown для формы. Мы попытаем обозначать те места, где якобы была нажата кнопка мыши. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Form1.Canvas.Ellipse(x-2,y-2,x+2,y+2);
end;



--------------------------------------------------------------------------------




эмуляция нажатия клавиш

Приведет к печати символа "A" в объекте Memo1. Memo1.Perform(WM_CHAR, Ord('A'), 0);
или
SendMessage(Memo1.Handle, WM_CHAR, Ord('A'), 0);



определение координат курсора в memo

В данном случае выводим координаты курсора в заголовке формы var X,Y: LongInt;
begin
Y:=Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0);
X:=Memo1.Perform(EM_LINEINDEX, Y, 0);
inc(Y);
X:=Memo1.SelStart-X+1;
Form1.caption:='X='+IntToStr(X)+':'+'Y='+IntToStr(Y);
end;



как определить когда мышь над компонентом, а когда она ушла с него

Для того, чтобы определить когда мышь над компонентом, в данном примере это будет панель, мы создадим новый класс, который будет являться потомком класса TPanel, и будет обрабатывать некоторые необходимые нам для данной задачи сообщения Windows.

Для этого определим следующим образом новый тип:

type TMyPanel=class(TPanel)
public
procedure CMMouseEnter (var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave (var Message: TMessage); message CM_MOUSELEAVE;
end;



Называться наш новый класс будет TMyPanel. Определить его можете до определение класса формы, т.е. сразу после директивы uses.

После объявления экземпляра формы нужно объявить экземпляр нашего нового класса:

var
Form1: TForm1;

MyPanel1:TMyPanel;


В разделе implemetation обрабатываем несколько сообщения, именно этими обработчиками наш класс и будет отличаться от класса стандартной панели.

procedure TMyPanel.CMMouseEnter (var Message: TMessage);
begin
Form1.Label1.Caption:='Мышь на панели';
end;

procedure TMyPanel.CMMouseLEAVE (var Message: TMessage);
begin
Form1.Label1.Caption:='Мышь вне панели';
end;


По созданию окна создаём экземпляр нашего класса:

procedure TForm1.FormCreate(Sender: TObject);
begin
MyPanel1:=TMyPanel.Create(self);
MyPanel1.Parent:=Form1;
MyPanel1.Visible:=True;
MyPanel1.Left:=100;
MyPanel1.Top:=100;
end;

По уничтожению окна, соответственно, - уничтожаем:

procedure TForm1.FormDestroy(Sender: TObject);
begin
MyPanel1.Destroy;
end;



как в memo прокрутить текст

В поле ввода вводите на какую строку нужно сойти, и по нажатию на кнопку эта строка будет попадать о зону видимости:




procedure TForm1.Button1Click(Sender: TObject);
var
line: integer;
begin
line := StrToIntDef(Edit1.Text,1);
Memo1.SelStart := Memo1.Perform(EM_LINEINDEX, line, 0);
Memo1.Perform(EM_SCROLLCARET, 0, 0);
end;


--------------------------------------------------------------------------------




как сделать отступ в memo

var Rect: TRect;
begin
SendMessage( Memo1.Handle, EM_GETRECT, 0, LongInt(@Rect));
Rect.Left:= 20;
SendMessage(Memo1.Handle, EM_SETRECT, 0, LongInt(@Rect));
Memo1.Refresh;
end;



как использовать процедуру mouse_event для имитации событий мыши

На форму вынесены две кнопки. По нажатию первой напишем:

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('Button 1 clicked');
end;



А нажатие второй обработаем так:
procedure TForm1.Button2Click(Sender: TObject);
var
Pt : TPoint;
begin
{Позволим кнопке Button2 перерисоваться}
Application.ProcessMessages;
{Найдем координаты центра button 1}
Pt.x := Button1.Left + (Button1.Width div 2);
Pt.y := Button1.Top + (Button1.Height div 2);
{Преобразуем Pt к координатам экрана}
Pt := ClientToScreen(Pt);
{Преобразуем Pt к "mickeys" (аболютным координатам курсора мышки}
Pt.x := Round(Pt.x * (65535 / Screen.Width));
Pt.y := Round(Pt.y * (65535 / Screen.Height));
{Переместим курсор мыши}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or
MOUSEEVENTF_MOVE,
Pt.x,
Pt.y,
0,
0);
{Имитируем нажатие левой кнопки мыши}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or
MOUSEEVENTF_LEFTDOWN,
Pt.x,
Pt.y,
0,
0);;
{Имитируем отпускание левой кнопки мыши}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or
MOUSEEVENTF_LEFTUP,
Pt.x,
Pt.y,
0,
0);
end;


--------------------------------------------------------------------------------




как сделать так, чтобы в memo переносилось не слово целиком, а только та часть слова, которая не помещается

Сначала нужно объявить две глобальных переменные OriginalWordBreakProc : pointer;
NewWordBreakProc : pointer;



Затем описываем в разделе implementation следующую процедуру: function MyWordBreakProc(LPTSTR : pchar;
ichCurrent : integer;
cch : integer;
code : integer) : integer
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
begin
result := 0;
end;

По созданию окна пишем такой код:

procedure TForm1.FormCreate(Sender: TObject);
begin
OriginalWordBreakProc := Pointer(
SendMessage(Memo1.Handle,
EM_GETWORDBREAKPROC,
0,
0));
{$IFDEF WIN32}
NewWordBreakProc := @MyWordBreakProc;
{$ELSE}
NewWordBreakProc := MakeProcInstance(@MyWordBreakProc,
hInstance);
{$ENDIF}
SendMessage(Memo1.Handle,
EM_SETWORDBREAKPROC,
0,
longint(NewWordBreakProc));
end;

...а по уничтожению

procedure TForm1.FormDestroy(Sender: TObject);
begin
SendMessage(Memo1.Handle,
EM_SETWORDBREAKPROC,
0,
longint(@OriginalWordBreakProc));
{$IFNDEF WIN32}
FreeProcInstance(NewWordBreakProc);
{$ENDIF}
end;


--------------------------------------------------------------------------------




как корректно определить изменения в оборудовании plug&play?

type
TForm1 = class(TForm)
Button1: TButton;
private
{ Private declarations }
procedure WMDeviceChange(var Message: TMessage);
message WM_DEVICECHANGE;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

const DBT_DEVICEARRIVAL = $8000;
const DBT_DEVICEQUERYREMOVE = $8001;
const DBT_DEVICEQUERYREMOVEFAILED = $8002;
const DBT_DEVICEREMOVEPENDING = $8003;
const DBT_DEVICEREMOVECOMPLETE = $8004;
const DBT_DEVICETYPESPECIFIC = $8005;
const DBT_CONFIGCHANGED = $0018;

procedure TForm1.WMDeviceChange(var Message: TMessage);
var
s : string;
begin
{Do Something here}
case Message.wParam of
DBT_DEVICEARRIVAL :
s := 'A device has been inserted and is now available';
DBT_DEVICEQUERYREMOVE: begin
s := 'Permission to remove a device is requested';
ShowMessage(s);
{True grants premission}
Message.Result := integer(true);
exit;
end;
DBT_DEVICEQUERYREMOVEFAILED :
s := 'Request to remove a device has been canceled';
DBT_DEVICEREMOVEPENDING :
s := 'Device is about to be removed';
DBT_DEVICEREMOVECOMPLETE :
s := 'Device has been removed';
DBT_DEVICETYPESPECIFIC :
s := 'Device-specific event';
DBT_CONFIGCHANGED :
s:= 'Current configuration has changed'
else s := 'Unknown Device Message';
end;
ShowMessage(s);
inherited;
end;



как перехватить сообщение прокрутки tscrollbox'a?

type
{$IFDEF WIN32}
WParameter = LongInt;
{$ELSE}
WParameter = Word;
{$ENDIF}
LParameter = LongInt;

{Declare a variable to hold the window procedure we are replacing}
var
OldWindowProc : Pointer;

function NewWindowProc(WindowHandle : hWnd;
TheMessage : WParameter;
ParamW : WParameter;
ParamL : LParameter) : LongInt
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
var
TheRangeMin : integer;
TheRangeMax : integer;
TheRange : integer;
begin
if TheMessage = WM_VSCROLL then
begin
{Get the min and max range of the horizontal scroll box}
GetScrollRange(WindowHandle, SB_HORZ, TheRangeMin, TheRangeMax);
{Get the vertical scroll box position}
TheRange := GetScrollPos(WindowHandle, SB_VERT);
{Make sure we wont exceed the range}
if TheRange < TheRangeMin then
TheRange := TheRangeMin else
if TheRange > TheRangeMax then
TheRange := TheRangeMax;
{Set the horizontal scroll bar}
SetScrollPos(WindowHandle, SB_HORZ, TheRange, true);
end;
if TheMessage = WM_HSCROLL then
begin
{Get the min and max range of the horizontal scroll box}
GetScrollRange(WindowHandle, SB_VERT, heRangeMin, TheRangeMax);
{Get the horizontal scroll box position}
TheRange := GetScrollPos(WindowHandle, SB_HORZ);
{Make sure we wont exceed the range}
if TheRange < TheRangeMin then
TheRange := TheRangeMin
else
if TheRange > TheRangeMax then
TheRange := TheRangeMax;
{Set the vertical scroll bar}
SetScrollPos(WindowHandle, SB_VERT, TheRange, true);
end;

{Call the old Window procedure to allow processing of the message.}
NewWindowProc := CallWindowProc(OldWindowProc, WindowHandle, TheMessage,
ParamW, ParamL);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{Set the new window procedure for the control and remember
the old window procedure.}
OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC,
LongInt(@NewWindowProc)));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
{Set the window procedure back to the old window procedure.}
SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC, LongInt(OldWindowProc));
end;



как отловить момент окончания изменения размеров компонента?

В следующем примере показан перехват сообщения WM_EXITSIZEMOVE Хотя сообщение документированно только для Windows NT оно работает точно так же и под Windows 95. Обратите внимание что Вы можите перехватить сообщение WM_ENTERSIZEMOVEдля определения момента начала пользователем операции изменения размера или перемещения окна.



type
TForm1 = class(TForm)
private
{ Private declarations }
public
procedure WMEXITSIZEMOVE(var Message: TMessage);
message WM_EXITSIZEMOVE;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.WMEXITSIZEMOVE(var Message: TMessage);
begin
Form1.Caption := 'Finished Moving and sizing';
end;



как заставить мигать кнопку программы на панели задач

Нужно вынести компонент Timer и событие OnTimer описать так:


procedure TForm1.Timer1Timer(Sender: TObject);
begin
FlashWindow(Application.Handle, True);
end;




получение иконки из *.ico; *.exe; *.dll

Процесс получения иконок из .EXE, .DLL или .ICO файлов полностью идентичен. Различие только в том, что в .ICO файле может храниться только одна иконка, а в .EXE и .DLL несколько. Для получения иконок из файлов, в модуле ShellAPI, есть функция:


function ExtractIcon(Inst: THandle; FileName: PChar; IconIndex: Word): HIcon;

где
Inst - указатель на приложение вызвавшее функцию,
FileName - имя файла из которого необходимо получить иконку,
IconIndex - номер необходимой иконки.

Если функция возвращает значение не равное нулю, то в файле есть следующая иконка.

В данном примере в компонент Image1 выводится иконка запущенного файла.

USES ShellAPI;
............
procedure TForm1.FormCreate(Sender: TObject);
VAR A: ARRAY [0..78] OF Char;
begin

{Получение имени запущенного файла}
StrPCopy(A, ParamStr(0));
{Вывод на экран нулевой иконки из файла}
Image1.Picture.Icon.Handle := ExtractIcon(HInstance, A, 0);

end;


Если вы хотите создать некий браузер по иконкам, то можете воспользоваться компонентами с закладки Win3.1. Вынесите на форму компонент TFileListBox; затем TDirectoryListBox, в свойстве FileList укажите на список файлов [TFileListBox]; после этого возьмите компонент класса TDriveComboBox, указав в его свойстве DirList на список каталогов [TDirectoryListBox], ну, и, наконец, ставьте TFilterComboBox, который позволит в списке файлов отображать только те файлы, которые соответствуют маске, указанной в свойстве Filter. Здесь в качестве значения укажите следующее: ico *.ico dll *.dll exe *.exe all*.ico; *.dll; *.exe ..а в свойстве FileList задайте список файлов [TFileListBox]. В обработчике OnClick компонента TFileListBox напишите такой код:

VAR A: ARRAY [0..78] OF Char;
begin
{Получение имени файла, указанного в списке файлов}
StrPCopy(A, FileListBox1.FileName);
{Вывод на экран нулевой иконки из файла}
Image1.Picture.Icon.Handle := ExtractIcon(HInstance, A, 0);


--------------------------------------------------------------------------------




как поместить графический элемент в tlistbox

Сначала создайте bmp-файл, который вы будете помещать около каждого элемента списка, в примере это 'c:\file.bmp'. Для создания файла можете воспользоваться специальной графической утилитой ImageEditor, которая входит в пакет Delphi. Желательно, чтобы размер файлы был 16х16. После этого вынесите на форму компонент TListBox. Его свойство Style установите в lbOwnerDrawVariable - это позволит нам прорисовывать каждый элемент списка самостоятельно.


Далее объявляем переменную после

var
Form1: TForm1;

переменная должна быть класса TBitmap

Bit:TBitmap;

После этого задаём обработчику события OnDrawItem следующий вид:

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var cc:TCanvas;
begin
cc:=(Control as TListBox).Canvas;
cc.FillRect(rect);
cc.Draw(Rect.Left+Rect.Right-16,Rect.Top,Bit);
cc.TextOut(Rect.Left,Rect.Top,ListBox1.Items[index]);
end;

...а обработчику события OnMeasureItem такой:

procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
var Height: Integer);
begin
Height:=16;
end;

По созданию окна создаёт Bitmap и загружаем в него данные из файла:

procedure TForm1.FormCreate(Sender: TObject);
begin
Bit:=TBitmap.Create;
Bit.LoadFromFile('c:\file.bmp');
end;

По уничтожению окна - уничтожаем Bitmap:

procedure TForm1.FormDestroy(Sender: TObject);
begin
Bit.Destroy;
end;




как заставить перерисоваться все окна

Вот так:

InvalidateRect(0,nil,true);




как преобразовать bmp в jpeg

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

uses JPEG;

procedure TForm1.Button1Click(Sender: TObject);
var
JPEG: TJPEGImage;
Bitmap: TBitmap;
begin
JPEG := TJPEGImage.Create;
Bitmap := TBitmap.Create;
try
Bitmap.LoadFromFile('C:\Program Files\Common Files\alarm.bmp');
JPEG.Assign(Bitmap);
Image1.Picture.Assign(JPEG);
finally
JPEG.Free;
Bitmap.Free;
end;
end;

end.



можно ли как-то уменьшить мерцание при перерисовке компонента

Если добавить флаг csOpaque (непрозрачный) к свойству ControlStyle компонента - то фон компонента перерисовываться не будет.


constructor TMyControl.Create;
begin
inherited;
ControlStyle := ControlStyle + [csOpaque];
end;





как узнать количество бит в цветовой палитре?

function GetDisplayColors : integer;
var tHDC : hdc;
begin
tHDC:=GetDC(0);
result:=GetDeviceCaps(tHDC, 12)* GetDeviceCaps(tHDC, 14);
ReleaseDC(0, tHDC);
end;



как написать приложение, адекватно отображающееся на экранах с различным разрешением монитора?

unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
{Отлавливаем, сообщение о изменении разрешения экрана}
procedure WMDisplayChange(var message: TMessage); message WM_DISPLAYCHANGE;
public
{ Public declarations }
W, H: integer;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
Width := Round(Width * 1.5);
Height := Round(Height * 1.5);
ScaleBy(150, 100)
end;

procedure TForm1.WMDisplayChange(var message: TMessage);
begin
inherited;
Width := Round(Width * LOWORD(message.LParam) / W);
Height := Round(Height * HIWORD(message.LParam) / H);
ScaleBy(LOWORD(message.LParam), W);
W := Screen.Width;
H := Screen.Height;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
W := Screen.Width;
H := Screen.Height;
end;

end.



tcolor

Что такое TColor?

Для хранения цвета существует свой собственный тип, который называется TColor. Этот тип содержит информацию, как о самом цвете, так и том, каким образом его заменить, если, например, цветовая палитра системы не поддерживает этот цвет (скажем, установлено всего 256 цветов, а цвет, заданный в переменной, вылезает далеко за пределы этих 256 цветов).

Тип TColor состоит из четырех байт. Первый байт - указатель на замену цвета (о нем поговорим позже). Второй байт - яркость красного цвета от 0 до 255 (от 00 до FF). Третий байт - яркость зеленого цвета от 0 до 255 (от 00 до FF). И, наконец, четвертый байт - яркость синего цвета, также, от 0 до 255 (от 00 до FF).

А как Вы уже знаете, из этих трех цветов: красного, зеленого и синего, регулируя их яркость, можно составить практически любой цвет.

Поговорим теперь о первом байте - указателе на замену цвета. Итак, этот байт может принимать три различных значения - ноль ($00), единицу ($01) или двойку ($02). Что это значит:

Ноль ($00) - цвет, который не может быть воспроизведен точно, заменяется ближайшим цветом из системной палитры.
Единица ($01) - цвет, который не может быть воспроизведен точно, заменяется ближайшим цветом из палитры, которая установлена сейчас.
Двойка ($02) - цвет, который не может быть воспроизведен точно, заменяется ближайшим цветом из палитры, которую поддерживает текущее устройство вывода (в нашем случае - монитор).

Видимо, всегда лучше устанавливать значение первого байта равным нулю ($00), по крайней мере, так происходит при получении типа TColor при помощи функции RGB.

И, напоследок, несколько примеров:
$00FFFFFF - белый цвет;
$00000000 - черный цвет;
$00800000 - темно-красный цвет.





снимок desktop

public
{ Public declarations }
procedure GrabScreen;
...

implementation
{$R *.DFM}

procedure TForm1.GrabScreen;
var
DeskTopDC: HDc;
DeskTopCanvas: TCanvas;
DeskTopRect: TRect;
begin
DeskTopDC := GetWindowDC(GetDeskTopWindow);
DeskTopCanvas := TCanvas.Create;
DeskTopCanvas.Handle := DeskTopDC;
DeskTopRect := Rect(0,0,Screen.Width,Screen.Height);
Form1.Canvas.CopyRect(DeskTopRect,DeskTopCanvas,DeskTopRect);
ReleaseDC(GetDeskTopWindow,DeskTopDC);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
GrabScreen;
end;



компоненты tnmmsg и tnmmsgserv [закладка fastnet]

Эти компоненты обмениваются простыми текстовыми сообщениями в кодах ASCII по Интернет или Интранет с использованием протокола TCP/IP. Вы можете использовать их для создания чата или или для программы переговоров в локальной сети.


На компьютере, куда будут посылаться сообщения, должен быть запущен TNMMsgServ. Для того, чтобы компонент TNMMsg смог отправить сообщение, вам нужно в свойстве Host указать удалённый компьютер, на котором находится серверная часть приложения. Это может быть имя или IP-адрес. Кроме этого значение свойства Port компонента TNMMsg должно соответствовать значению этого же свойства компонента TNMMsgServ. Стандартный порт, который слушает этот компонент, имеет номер 6711. В свойстве FromName укажите имя своего компьютера, чтобы получатель мог знать от кого получено сообщение. После определения этих свойств, вы можете отправить сообщение, вызвав метод PostIt. Если метод выполняется успешно генерируется событие OnMessageSent. У этого компонента только 1 свой метод - остальные наследуются. Свойство FromName - тоже единственное своё.

Компонент TNMMsgServ предназначен для получения сообщений, отправленных компонентом TNMMsg. У него нет своих свойств и методов, только унаследованные. Главное событие серверного компонента - OnMsg. возникает оно при получении сообщения, текст которого передаётся обработчику события через параметр sMsg. Другой параметр этого обработчика sFrom содержит имя отправителя.

Пример:

Для этого примера вам нужно создать новое приложение Delphi и вынести на форму 3 метки (TLabel) и 3 поля ввода (TEdit), 1кнопку и 2 Memo. Кроме того в форму нужно добавить компоненты TNMMsgServ и TNMMsg. Первый будет принимать сообщения, второй - посылать. Доведите форму до состояния, показанного на рисунке.



По нажатию на кнопку напишите следующий код:

NMMsg1.FromName:=Edit2.Text;
NMMsg1.Host:=Edit3.Text;
NMMsg1.PostIt(Edit1.Text);

Для компонента TNMMsgServ событие OnMsg опишите так

Memo1.Lines.Add('Получено сообщение от '+sFrom);
Memo2.Lines.Add('['+sFrom+'] '+sMsg);

Здесь Memo1 используется для ведения протокола, а в Memo2 будут отображаться сообщения в формате "[отправитель] сообщение"

Для компонента TNMMsg опишите событие OnMessageSent:

Memo1.Lines.Add('Отправлено сообщение от '+DateTimeToStr(Now));

В этом обработчике будет отслеживаться дата и время отправления сообщения.




компонент tnmecho [закладка fastnet]

Компонент применяется для отсылки текстовых сообщений на эхо-сервер и получения этого сообщения обратно в соответствии со стандартом RFC 862.


Этот компонент обычно применяется для тестирования и настройки сети., поскольку мы можем оценить время ответа сервера, которое помещается в свойство ElapsedTime. Это единственное собственное свойство компонента, остальные наследуются.

Перед отправкой сообщения должно быть установлено соединение с сервером. Для этого нужно задать имя сервера или его адрес в свойстве Host, а в свойстве Port определить соответствующий порт [обычно серверы эхо слушают 7-ой порт]. После этого нужно вызвать метод Connect. Для отправки сообщения нужно использовать метод Echo. В случае успеха вы должны получить от сервера ту строку, которую вы передали в качестве параметра методу Echo. После этого для завершения связи вы должны вызвать метод Disconnect. Все методы, кроме Echo, компонент наследует.

Пример:



Создает окно, показанное на рисунке. Затем описываем события по нажатию на кнопках.

"Подключиться"

NMEcho1.Host:=Edit1.Text;
NMEcho1.Connect;

"Отключиться"

NMEcho1.Disconnect;

"Отправить"

Memo1.Lines.Add(NMEcho1.Echo(Edit2.Text)+'время ['+FloatToStr(NMEcho1.ElapsedTime)+']');

"Прекратить"

NMEcho1.Abort;




компонент tnmfinger [закладка fastnet]

Данный компонент применяется для получения информации о пользователе от сервера Finger, используя протокол, описанный в стандарте RFC 1288.


Для того, чтобы получить информацию о пользователе, помещаемую в свойство FingerStr, вам нужно в свойстве Host указать имя сервера Finger. Обычно свойство Port не нужно определять, поскольку большинство рассматриваемых серверов используют 79-ый порт. И, конечно, вам нужно указать интересующее вас имя пользователя в свойстве User. Иногда эта служба используется для получения некоторой информации, например, о спорте, погоде. Обратившись по такому адресу, вы найдёте в свойстве FingerStr рассылаемую информацию.

Пример:



Сделайте такую же форму, как показана на рисунке [на рисунке показана форма уже после выполнения запроса]. По нажатию на кнопку напишите такой код: NMFinger1.User:=Edit2.Text;
NMFinger1.Host:=Edit1.Text;
Memo1.Text:=NMFinger1.FingerStr;

Ну вот, казалось бы и всё, но чтобы программа уведомляла вас о каждом событии нужно вынести StatusBar, в свойстве Panels создать 1 панель. И описать все события компонента TNMFinger примерно так:

procedure TForm1.NMFinger1Connect(Sender: TObject);
begin
StatusBar1.Panels[0].Text:='Подключились';
end;

procedure TForm1.NMFinger1ConnectionFailed(Sender: TObject);
begin
StatusBar1.Panels[0].Text:='Невозможно установить соединение';
end;

procedure TForm1.NMFinger1Disconnect(Sender: TObject);
begin
StatusBar1.Panels[0].Text:='Отсоединились';
end;

procedure TForm1.NMFinger1HostResolved(Sender: TComponent);
begin
StatusBar1.Panels[0].Text:='Host найден';
end;

procedure TForm1.NMFinger1InvalidHost(var Handled: Boolean);
begin
StatusBar1.Panels[0].Text:='Host указан неверно';
end;

procedure TForm1.NMFinger1Status(Sender: TComponent; Status: String);
begin
StatusBar1.Panels[0].Text:=Status;
end;




компонент tnmftp [закладка fastnet]

Компонент TNMFTP предназначен для обмена файлами между сервером FTP и клиентской машиной по протоколу FTP. FTP является одной из старейших и заслуженных служб интернета.


Она существовала тогда, когда ещё не было WWW и предоставляла удобный по тем временам сервис для обмена файлами и организации различных архивов документов и программ. Сейчас получить доступ к серверу FTP можно непосредственно из браузера WWW, так что клиентские программы для работы с сервером FTP уже не так актуальны. Мы рассмотрим пример с этим компонентом, поскольку такая программа может потребоваться для работы с корпоративным FTP-сервером, где доступ разграничен и требуется пройти идентификацию для доступа к файловому архиву.

Перед использованием компонента TNMFTP для обмена файлами с удалённым компьютером вам нужно подключиться к серверу FTP. Для этого вы должны определить свойства Host и Port значениями, соответствующими нужному серверу FTP. Затем задайте в свойствах UserID и Password необходимые имя пользователя и пароль. Многие публичные серверы FTP принимают значение Anonymous в качестве имени пользователя и в качестве пароля ваш e-mail или строку, напоминающую e-mail, например, user@mycomputer.com, главное, чтобы в этой строке присутствовал символ собачки "@". Таких анонимных серверов в интернет довольно много и используются они как публичные архивы программ и документов. После определения свойств UserID и Password вызывайте метод Connect для установки связи с сервером.

Компонент TNMFTP имеет следующие основные свойства:

CurrentDir

FTPDirectoryList

OnListItem

ParseList

Password

UserID

Vendor

Специфических методов у этого компонента немного больше:

Allocate

ChangeDir

Delete

DoCommand

Download

DownloadRestore

List

MakeDirectory

Mode

Nlist

Reinitialize

RemoveDir

Rename

Upload

UploadAppend

UploadRestore

UploadUnique

Остальные свойства и методы этого компонента наследуются. Ниже мы разберём основные возможности этого компонента и разберём перечисленные свойства и методы.

Если метод компонента TNMFTP завершается успешно, то генерируется событие OnSuccess, в противном случае возникает событие OnFailture. В обоих случаях через параметр Trans_Type обработчиков этих событий передаётся имя команды типа TCmdType. Этот параметр может принимать следующие значения:

cmdChangeDir

cmdMakeDir

cmdDelete

cmdRemoveDir

cmdList

cmdRename

cmdUpRestore

cmdDownRestore

cmdDownload

cmdUpload

cmdAppend

cmdReInit

cmdAllocate

cmdNlist

cmdDoCommand

cmdCurrentDir

Думаю, имя метода, к которому относится данное значение определить не трудно.

Определение содержимого каталога на удалённом компьютере:

Если вы уже подключены к серверу, вы можете получить список файлов файлов и каталогов текущего каталога при помощи метода List и обработчика события OnListItem, которое вызывается для каждого элемента списка. Вы можете обрабатывать каждый элемент каталога в обработчике этого события. или включить режим разбора строк элементов каталога, установив свойство ParseList в true. В последнем случае компонент разберёт полученные данные и поместит имена, размеры файлов атрибуты, время последнего изменения в составное свойство FTPDirectoryList. Каждый элемент этого свойства представляет собой объект типа TStringList. Для указанных элементов списка содержимого каталога эти объекты имеют имена Name[i], Size[i], ModifDate[i], Attribute[i]. Если метод List завершается успешно, то происходит событие OnSuccess, в противном случае генерируется событие OnFailure. Метод NList представляет собой сокращённый вариант команды List и используется для получения только имён файлов и каталогов.

Изменение текущего каталога на удалённом компьютере:

Вы можете перейти на другой каталог сервера FTP, вызывая метод ChangeDir с именем нужного вам каталога, которое передаётся через параметр DirName. В DirName можно указывать полный путь или имя каталога относительно текущего каталога.

Загрузка файлов на удалённый компьютер:

Для загрузки файлов в текущий каталог на удалённом компьютере используем метод Upload. Метод использует 2 параметра: имя файла на локальном компьютере и имя, под которым он будет сохраняться на удалённом [LocalFile, RemoteFile]. Нужно заметить, что для выполнения данной операции у вас должны быть соответствующие права на удалённом компьютере. Обычно серверы FTP предоставляют такие права в каталоге incoming. В том случае, если на сервере уже есть файл с тем же именем, с которым вы хотите создать новый, - этот файл будет перезаписан. Избежать этого эффекта можно, если использовать метод UploadUnique. Единственный параметр LocalFile этого метода определяет имя файла на локальном компьютере и использует его для создаваемого файла на сервере. Если на сервере файл с таким именем уже существует, то передаваемый файл будет создан с уникальным именем. Метод UploadRestore хорош тем, что он позволяет восстановить прерванный в предыдущем сеансе процесс загрузки файла с места, в котором произошёл обрыв. Последний метод из этой серии UploadAppend позволяет дописывать содержимое локального файла в конец файла на сервере, если файл существует. Если на сервере такого файла нет, то файл создаётся заново. Два последних метода имеют 2 параметра LocalFile и RemoteFile.

Загрузка файлов с удалённого компьютера:

Перед загрузкой файлов с удалённого компьютера имеет смысл вызвать метод List и убедиться, что нужный вам файл имеется на удалённом компьютере. После этого можно вызвать метод по имени Download передав ему в качестве параметров имя загружаемого файла и имя файла и каталога на локальном компьютере: параметры RemoteFile и LocalFile. Нужно заметить, что загружать файлы из любого каталога FTP-сервера обычно не разрешается. Вы можете сделать это только из каталогов, открытых для этой операции. Если на вашем компьютере уже имеется файл с таким именем он будет перезаписан. На случай обрыва связи можно использовать метод DownloadRestore, который позволит продолжить загрузку с того места, на котором произошёл обрыв связи.

Создание каталога на удалённом компьютере:

Для выполнения этой операции у вас должны быть соответствующие права. Обычно на FTP-серверах эти права выделяются на каталог incoming. Для создания каталога достаточно вызвать метод MakeDirectory, передав ему в качестве параметра имя того каталога, который вы хотите создать.

Удаление файла или каталога на удалённом компьютере:

Файл удаляется методом Delete, а для удаления каталога применяется метод RemoveDir. Можно задавать имя файла или каталога внутри текущего каталога или указывать полный путь и имя удаляемого объекта.

Мы не упомянули ещё методы Allocate, DoCommand, Mode, Reinitialize и Rename. Первый метод выделяет место на FTP сервере под создаваемый файл. Как правило, этого делать не требуется, но если вам придётся работать с таким сервером, который требует выделения дисковой памяти перед закачкой на него файла, то этот метод может понадобится.

Метод DoCommand позволяет посылать команду FTP-серверу, который должен её выполнить. Имеется в виду команда операционной системы. Этот метод может вам понадобиться, если для выполнения вашей задачи методов компонента TNMFTP окажется недостаточно, либо если вам попадётся сервер с нестандартными командами.

Метод Rename используется для переименования файла в текущем каталоге на удалённой системе. Первый параметр FileName задаёт имя файла, который нужно переименовать, второй - FileName2 - новое имя для заданного файла.

Метод Mode задаёт режим приёма/передачи файлов. Используются 3 режима. Соответственно параметр TheMode может принимать соответствующие значения:

MODE_ASCII - передача текстовых данных

MODE_IMAGE - двоичные данные с 8-битовыми байтами

MODE_BYTE - двоичные данные с байтами переменной длины

Метод Reinitialize используется для восстановления прерванного соединения. После этого метода требуется зарегистрироваться, ввести имя пользователя и пароль.




компонент tnmhttp [закладка fastnet]

Компонент TNMHTTP используется для передачи гипертекста через WWW или интранет по протоколу HTTP. Компонент поддерживает версию протокола HTTP1.1.


Вы можете использовать соответствующие методы для работы с документами. Компонент имеет 7 методов: Get, Head, Options, Trace, Put, Post, Delete.

Метод Get применятся для получения гипертекстовых документов с серверов World Wide Web. Запрашиваемый документ указывается в параметре URL. Дальнейшая судьба документа зависит от значения InputFileMode типа Boolean. Если свойству присвоено значение true, о заголовок документа и его тело помещаются в текстовый документ и HTTP файлы соответственно. Имена файлов для этого случая определяются свойствах Header и Body. Если свойство InputFileMode выставлено в false, то заголовок и тело документа размещаются непосредственно в свойствах Header и Body.

Метод Head аналогичен методу Get, но с его помощью можно загрузить только заголовок документа. Заголовок тем же образом может помещаться либо в файл, либо в свойство Header.

Методы Post и Put выполняют обратную задачу - публикацию документов в WWW. Метод Post позволяет дописать данные в соответствующий документ на сервере. Метод Put создаёт новый документ на сервере. Эти методы имеют 2 параметра. Первый из них - это параметр с именем URL, в котором указывается имя документа на WEB-сервере. Второй параметр типа string по имени PostData у метода Post и PutData у метода Put используется для задания публикуемых данных. Данные передаются непосредственно через этот строковый параметр, если свойство OutputFileMode имеет значение false. Если этому свойству присвоить значение true, тогда во втором параметре указываются путь и имя файла, в котором размещаются данные для публикации. Нужно заметить, что для того чтобы опубликовать данные на сервере WEB, у вас должны быть соответствующие права. Как и права на удаление файла если вы используете метод Delete, с помощью которого можно удалять документы на удалённом сервере.

Метод Abort прерывает выполнения транзакции.

Оставшиеся 2 метода предоставляют дополнительные возможности. Метод Trace применяется при отладке. Метод использует указанный а первом параметре ресурс для отображения отладочных данных, передаваемых во втором параметре TraceData. Данные передаются через этот параметр уже известным способом в зависимости от значения свойства OutputFileMode.

И последний метод - метод Options позволяет получить справочную информацию о запрашиваемом ресурсе и командах [методах], разрешённых на данном сервере. Выполнить все методы на большинстве серверов вам не удастся. Обычно вам разрешают использовать метода Get, Head, Options, Trace.

Компонент имеет свойства Port и Host, которые здесь излишни, поскольку эта информация задаётся через параметр URL методов этого компонента. Свойствам InputFileMode и OutputFileMode присваивается по умолчанию значение false. В составном свойстве HeaderInfo имеются свойства UserID и Password, необходимые в том случае, если вам нужно публиковать данные на WEB-сервере. Понятно, что в этом случае вам потребуются соответствующие права доступа, и, значит, регистрация на сервере под некоторым именем, после ввода которого придётся указать и пароль. Ещё вам могут понадобиться свойства BytesRecvd, BytesSent и BytesTotal, которые указывают число принятых байтов, отправленных данных и общее число передаваемых байтов.




--------------------------------------------------------------------------------




компонент tnmnntp [закладка fastnet]

Компонент TNMNNTP используется для чтения и публикации сообщений в телеконференциях Интернет [NetNews, NewGroups] в соответствии с протоколом NNTP [Network News Transfer Protocol]. Протолок описан в стандарте RFC 977.


Наряду с электронной почтой и серверами FTP телеконференции являются классическим сервисов Интернет. Ветераны Интернет продолжают пользоваться им весьма активно, но новые пользователи, в ввиду засилья WWW, знают этот сервис плохо, хотя работу с новостями поддерживают не только специальные программы, но и Microsoft Outlook Express и Netscape Navigator. Телеконференции имеют иерархическую структуру. Название конференции состоит из нескольких слов, разделённых точками. Чтобы получить доступ к этому сервису, вам нужно подключиться к одному из серверов новостей. Обычно поставщики услуг Интернет наряду с электронной почтой предоставляют доступ к своему серверу новостей. Если у вашего провайдера нет своего сервера, то вам придётся найти его с помощь поисковых систем Интернет. В отличии WWW, для доступа к которой не требуется использование какого-то специфического сервера, с электронными новостями нужно работать именно так- через сервер. Подключившись к серверу, вы должны сначала загрузить полный список конференций, который он поддерживает. Сервер, к которому вы подключитесь, возможно, будет иметь не полный список, а какой-то ограниченный набор телеконференций Интернет. После этого вам нужно подписаться на какое-то количество конференций и загрузить из них заголовки сообщений. Ваша подписка будет сохраняться на все последующие сеансы связи, пока вы не откажитесь от неё. Размещение сообщений в конференции часто называется публикацией [posting], а само сообщение называется словом статья [article].

Итак, прежде чем начинать работу с сервером новостей, вам нужно подключиться к одному из серверов. Это можно сделать, задав нужное имя сервера новостей в свойстве Host и вызвав метод Connect, который подключит вас к выбранному серверу. После этого вам нужно получить список групп новостей этого сервера. Для этой цели вызывается метод GetGroupList, который помещает полученный список в свойство GroupList. После этого нужно выбрать одну из групп новостей, в которой вы будете просматривать сообщения. Для этого вызывается метод SetGroup, которому к качестве параметра передаётся имя выбранной вами группы новостей. Чтение статей в выбранной группе новостей осуществляется при помощи метода GetArticle. Но перед этим нужно загрузить список сообщений из группы методом GetArticleList. После этого для каждой интересующей вас статьи нужно вызывать метод GetArticle, который будет помещать в свойство Body текст статьи, а в свойство Header - заголовок выбранной статьи.

Для того, чтобы отправить статью в группу новостей сначала нужно заполнить свойство PostBody текстом сообщения, в свойстве PostHeader разместить заголовок сообщения, а после этого вызвать метод PostArticle.

После обсуждения порядка работы с компонентом поговорим о его свойствах, методах и событиях. Основными свойствами являются следующие свойства:

GroupList

SelectedGroup

Body

Header

CurrentArticle

HiMessage

LoMessage

PostBody

PostHeader

В свойстве GroupList типа TStringList размещается список групп новостей выбранного сервера. Свойство заполняется в случае успешного вызова метода GetGroupList. После успешного вызова метода SetGroup в свойство SelectedGroup помещается имя выбранной группы. Метод GetArticleList имеет 2 параметра All типа boolean и ArticleNumber - целого типа. Если первый параметр выставляется в true, то считываются все статьи группы, в противном случае второй параметр задаёт номер сообщения с которого нужно начать загрузку. При загрузки очередной статьи происходит событие OnHeaderList. В свойство CurrentArticle помещается номер текущей статьи. Это свойство получает значение после вызова одного из методов GetArticle, GetArticleBody или GetArticleHeader. Можно сказать, что в это свойство помещается номер той статьи, текст и заголовок которой находятся в свойствах Body и Header. В свойствах HiMessage и LoMessage прописываются максимальный и минимальный номера сообщений, доступных в выбранной группе. В свойства PostBody и PostHeader помещают тело и заголовок отправляемого в группу сообщения. Возможность или невозможность публикации сообщения в выбранной группе определяется значением свойства Posting. типа boolean. Среди свойств компонента имеются составные свойства HeaderRecord и PostHeader, куда записываются тема сообщения электронный адрес отправителя и электронный адрес для ответа, имя группы или групп, в которых опубликовано данное сообщение, время и дата публикации и другие данные. В первом свойстве размещаются данные полученного сообщения, а во втором - отправляемого. В технологии электронных новостей, как и в электронной почте, применяется присоединение или вложение в сообщение одного или нескольких файлов. Свойства AttachFilePath, Attachments, PostAttachments и ParseAttachments служат для работы с вложенными файлами. Значение логического свойства ParseAttachments, равное true, задаёт режим разбора вложенных файлов, при котором файлы будут декодироваться. После этого они будут размещаться с имена, под которыми они перечислены в свойстве Attachments, в каталоге, заданном в свойстве AttachFilePath. Если в ParseAttachments записано false, то файлы просто остаются в теле сообщения. Если вы присоединяете к отправляемому сообщению некоторое количество файлов, то их имена перечисляются в свойстве PostAttachments. В случае если требуется регистрация пользователя на сервере новостей, в свойства UserID и Password помещаются имя пользователя и пароль.




компонент tnmpop3 [закладка fastnet]

Компонент TNMPOP3 применяется для получения электронных писем от POP3-сервера.


Вам может потребоваться этот компонент при написании программы для некоего корпоративного приложения, использующего свои, внутренние почтовые сервисы. Или вы можете написать программу под свои собственные нужды, которая собирала бы почту с нескольких почтовых серверов, сразу бы сортировала её и отбрасывала ненужный хлам и д.т.

Перед тем как получить электронную почту с помощью компонента TNMPOP3, вам нужно установить соединение с сервером POP3, на котором находится ваш почтовый ящик. Для этого нужно задать значение для свойства Host, в котором нужно указать имя почтового сервера или его IP-адрес. Вы должны задать так же имя пользователя и пароль в свойствах UserID и Password соответственно, открывающие вам доступ к вашему почтовому ящику. После этого вам нужно вызвать метод Connect, который и установит соединение.

Чтобы получить почту вам нужно вызвать метод GetMailMessage. Полученное сообщение будет попадать в свойство MailMessage.

Это был краткий обзор компонента. Сейчас мы обсудим детали по мере ознакомления со свойствами, методами и событиями этого компонента.

В свойстве MailCount этого компонента указывается число сообщений, находящихся в почтовом ящике пользователя на сервере. Это свойство получает значение после установки соединения с сервером. Свойству MailMessage присваивается значение после вызова метода GetMailMessage. В нём находятся все элементы полученного электронного сообщения. Эти элементы включают в себя свойства Attachments, Body, From, Head, MessageID и Subject. В первом помещаются имена вложенных файлов, во втором - текст сообщения, в третьем - адрес отправителя, в четвёртом - заголовок письма. В свойстве MessageID размещается уникальный идентификатор письма, а в свойстве Subject - тема письма.

Свойство Summary содержит краткую информацию об электронном сообщении. Это свойство изменяется после вызова метода GetSummary. В состав этого сложного свойства входят свойства: Bytes, From, Header, MessageID, Subject. Свойства этого составного свойства повторяют свойства из MailMessage, но в отличии от свойства MailMessage здесь не хватает свойств Attachments и Body и добавлено новое свойство Bytes - размер сообщения. Содержимое свойств MailMessage и Summary изменяется после каждого вызова метода GetMailMessage или GetSummary соответственно. Поэтому, если вы считываете несколько писем не забывайте обрабатывать полученные сообщения и только после этого переходите к следующему вызову метода GetMailMessage или GetSummary. В свойстве AttachFilePath вы можете задать каталог для размещения присоединённых к сообщению файлов. Если этого не сделать, то по умолчанию эти файлы будут сохраняться в том же каталоге, из которого запускалось приложение. Если каталог, указанный в свойстве AttachFilePath не существует, то присоединённые файлы будут сохраняться в текущем каталоге. Добавлять в конце пути символ "слэш" необязательно, если его не указали, то добавится автоматически. В зависимости от значения свойства DeleteOnRead прочитанные сообщения могут удалятся или оставаться в почтовом ящике на сервере. Сообщения удаляются после выполнения метода GetMailMessage, если свойство DeleteOnRead установлено в true. Если значение DeleteOnRead равно false, тогда сообщения остаются на сервере. По умолчанию сообщения не удаляются. Удаление сообщений происходит после завершения сеанса работы с сервером. Метод Reset позволяет снять метку на удаление, поэтому, пока сессия не окончена все удалённые методами DeleteOnRead и DeleteMailMessage сообщения можно "вернуть".

Для регистрации на сервере вам нужно задать значения свойствам UserID и Password. В свойстве Password указывается пароль, используемый для получения доступа к почтовому серверу. Если указан неверный пароль или имя пользователя, то в этом случае будет вызвано событие OnAuthenticationFailed, если пароль или имя пользователя не указаны вызывается событие OnAuthenticationNeeded.

Теперь обсудим методы этого компонента. Метод UniqueID возвращает идентификатор сообщения, указанного в параметре метода по номеру. Идентификатор представляет собой строковое уникальное значение, присваиваемое каждому письму почтовым сервером. Это значение помещается в свойство MessageID, являющееся частью составного свойства Summary типа TSummary. Параметр MailNumber изменяется от 1 до максимального значения, определяемого свойством MailCount.

Метод DeleteMailMessage удаляет указанное по номеру сообщение из почтового ящика на почтовом сервере. В случае возникновения ошибки возникает событие OnFailture и возбуждается исключительная ситуация. Если сообщение успешно помечается как удалённое, то происходит событие OnSuccess. Удалённое этим методом сообщение только помечаются как удалённые, реально они удаляются тогда, когда вы заканчиваете работу с почтовым сервером. А пока вы этого не сделали вы можете вызвать метод Reset, и все "удалённые" в данном сеансе связи сообщения опять станут доступными. Метод GetMailMessage извлекает указанное по своему номеру сообщение и помещает его в свойство MailMessage. Если при выполнении метода возникает ошибка, то возбуждается исключительная ситуация. Когда начинается процесс загрузки сообщения, наступает событие OnRetrieveStart. По окончании загрузки генерируется событие OnRetrieveEnd. Если сообщение благополучно получено происходит событие OnSuccess. Если свойство DeleteOnRead установлено в true, то метод GetMailMessage, кроме того, пометит на сервере полученное сообщение на удаление.

Метод GetSummary извлекает краткую информацию о письме и сохраняет её в свойстве Summary. Метод List получает список номеров и размеры сообщений. Для каждого сообщения в списке генерируется событие OnList, которому через параметры передаются номер сообщения и размер сообщения.

Нам осталось рассмотреть события данного компонента. Событие OnAuthenticationFailed происходит в случае, когда для работы с почтовым сервером требуется идентификация, в одном из свойств UserID или Password значение введено неверно. Если свойству Handled присвоить значение true, то попытка регистрации повторяется. Если в свойстве Handled прописано false [что является значением по умолчанию], то возбуждается исключительная ситуация, и соединение обрывается.

Событие OnDecodeStart возникает тогда, когда необходимо декодировать и запись на диск присоединённый к письму файл. В обработчике этого события имеется параметр FileName, определяющий имя присоединённого файла. Это имя можно изменить, если вы хотите сохранить файл под другим именем. Если в письме нет вложенных файлов, о событие не наступает. Добавлять путь к имени файла не следует, п.ч. путь указывается в свойстве AttachFilePath.

Событие OnList происходит в процессе работы метода List после получения номера и размера текущего сообщения в списке. Событие OnReset генерируется в случае успешного выполнения метода Reset и означает это тот факт, что со всех сообщений, помеченных в текущем сеансе на удаление, снята метка на удаление.

Событие OnRetrieveEnd происходит тогда, когда завершается загрузка письма или его резюме. Событие OnRetrieveStart генерируется когда начинается процесс загрузки сообщения. Эти события заменяют свои предыдущие версии, названные ошибочно OnRetriveEnd и OnRetriveStart. Эти предыдущие версии, тем не менее, доступны как Public, так что приложения, использующие их, будут работать.




компонент tnmsmtp [закладка fastnet]

Компонент TNMSMTP позволяет отправлять электронную почту через почтовый сервер Интернет или выполнить некоторые другие команды, описанные в стандарте RFC 821.


Этот компонент использует для отправки почты стандартный протокол SMTP [Simple Mail Transfer Protocol - простой протокол отправки почты]. Порт по умолчанию, используемый этим протоколом, - 25. Регистрация на многих SMTP-серверах при регистрации не требуется, соответственно вводить имя пользователя при работе с какими-то серверами не требуется. Для работы с компонентом необходимо установить соединение с сервером. Для этого нужно задать значение свойствам Host и Port и вызвать метод Connect. По окончании работы с сервером вызывается метод Disconnect, который завершает установленное ранее соединение.

Главное свойство этого компонента PostMessage. Именно в нём размещается вся информация отправляемого сообщения. Это свойство имеет много полей, но обязательными для заполнения являются только два поля: адрес получателя ToAddress типа TStringList и адрес отправителя FromAddress типа String. В поле получателя можно записать несколько адресов получателя. Сам текст письма помещается в свойство Body типа TStringList. В строковые поля Subject, FromName, Organization записываются тема письма, имя отправителя и название организации. Поле Attachments типа TStringList используется для указания списка вложенных файлов. Для отправки письма применяется метод SendMail. Перед этим нужно установить соединение, т.е. вызвать метод Connect.

Дополнительно к основной задачи отправки почты компонент имеет два метода, с помощью которых вы можете проверить существование на сервере пользователя с указанным именем и получить от сервера список адресов листа рассылки. Первый метод - метод Verify. Под именем пользователя понимается электронный адрес. Некоторым серверам достаточно указать только начальную часть адреса - до символа "@", для других нужно указать полный адрес. Если указанный адрес существует, функция Verify возвратит true, если не существует - false. Имя второго метода - ExpandList. После вызова этого метода генерируется событие OnMailListReturn, в обработчике которого вы можете обнаружить полученный список адресов.

Теперь рассмотрим свойства компонента. В свойстве ClearParams задаётся задаётся режим очистки или сохранения значений в свойстве PostMessage после того, как сообщение отправлено. Если свойству присвоено значение true, то после вызова метода SendMail поля свойства PostMessage очищаются. Если в свойстве ClearParams задано false, то значения, записанные в свойстве PostMessage, сохраняются. Значение по умолчанию - true. Свойство EncodeType определяет тип кодирования присоединяемых к письму файлов. Возможен выбор только из двух значений: uuMime если применяется метод MIME, и uuCode, которому соответствует метод UUEncode. По умолчанию используется метод MIME. В свойстве FinalHeader размещается окончательный вариант заголовка для приготовленного в отправке письма. Это свойство можно посмотреть или изменить с помощью события OnSentStart. В свойстве PostMessage записываются все необходимые элементы письма: адрес получателя[ToAddress] и отправителя[FromAddress], тема письма[Subject], присоединяемые файлы[Attachments], текст сообщения[Body], дата отправки сообщения[Date], имя отправителя[FromName], программа, отправляющая письмо[LacalProgram], адрес для ответа на отправляемое письмо[ReplyTo], адрес для копии[ToCarbonCopy] и для скрытой копии[ToBlindCarbonCopy].

В свойстве SubType определяется тип отсылаемого электронного сообщения. Например, если вы укажите в свойстве SubType значение mtHTML, то программа просмотра писем у получателя знать, что получила документ HTML , и будет пытаться адекватно работать с документом - не выводить теги HTML на экран как текст, а работать с ними как с управляющими последовательностями. Значение по умолчанию mtPlain. Свойство может принимать одно из следующих значений:

mtPlain - текст ASCII

mtEnriched - текст в формате RTF

mtSGML - документ в стандарте SGML

mtTagSeperated - текст с символами табуляции в качестве разделитетей

mtHTML - документ HTML

В свойстве UserID задаётся имя пользователя для регистрации на сервере SMTP. Не все серверы проверяют UserID, но многие делают это. Если ваш сервер проверяет имя отправителя, а вы его не указали, то тогда будет генерироваться событие OnAuthenticationFailed.

Теперь перейдём к рассмотрению методов компонента.

Метод ExpandList используется, когда нужно получить содержимое списка адресов на сервере SMTP. В параметре MailList задаётся имя интересующего вас списка. Когда сервер SMTP возвращает требуемый список, происходит событие OnMailListReturn.

Метод ExtractAddress выделяет адрес электронной почты из строки текста. Обычно этот метод используется для внутреннего употребления, хотя он имеет доступ Public и, соответственно, доступен всем. Строка передаётся через параметр, а выделенный адрес возвращается методом. Для выполнения метода ExtractAddress соединение с сервером SMTP не требуется.

Метод Verify используется для проверки существования пользователя на сервере SMTP.

Метод ClearParameters удаляет содержимое свойства PostMessage. При этом очищаются все поля за исключением Body. Для удаления самого сообщения необходимо вызвать метод PostMessage.Body.Clear. Если свойство ClearParams имеет значение true, то после каждого выполнения метода SendMail автоматически вызывается метод ClearParameters.

Метод SendMail выполняет отправку электронного письма, заданного в полях свойства PostMessage. После успешной отправки сообщения генерируется событие OnSuccess. Если при передачи сообщения на сервер произошла ошибка, происходит событие OnFailtureEvent.

Последними, как всегда, рассмотрим события компонента. Событие OnAttachmentNotFound генерируется, если не находится файл, который должен быть присоединён к отправляемому письму. Событие имеет параметр TFileItem, в котором указано имя отсутствующего файла. Событие OnEncodeEnd генерируется, когда присоединяемый к письму файл закодирован и приготовлен к отправке. Имя закодированного файла опять же передаётся через параметр TFileItem. Событие OnEncodeStart происходит перед началом кодирования присоединяемого к письму файла.

Событие OnHeaderIncomplete происходит, если остались незаполненными следующие свойства из свойства PostMessage: свойство FromAddress или ни одно из следующих свойств - ToAddress, ToCarbonCopy, ToBlindCarbonCopy. Событие относится к типу THeaderIncomplete, является модификацией типа THandlerEvent и в добавление к параметру Handled типа boolean имеет ещё один параметр целого типа hiType. Этот последний параметр указывает номер незаполненного поля и может принимать следующие значения:

hiFromAddress: не заполнено поле FromAddress

hiToAddress: не заполнено ни одно из полей ToAddress, ToCarbonCopy или ToBlindCarbonCopy

Если у параметра Handled значение true, то попытка отправить сообщение повторяется. Если и после второй попытки ни одно из требуемых полей ни одно из требуемых полей оказывается незаполненным, возбуждается исключительная ситуация, и сообщение не посылается, хотя работа с ним продолжается, и вы вновь можете попытаться его отправить.

Событие OnMailListReturn наступает когда метод ExpandList получает от почтового сервера список адресов. Список передаётся обработчику события через параметр.

Событие OnRecipientNotFound происходит если не найден один из получателей сообщения. Событие получает ошибочный адрес в качестве значения своего параметра.

Событие OnSendStart генерируется непосредственно перед отправкой электронного сообщения. Событие даёт последнюю возможность внести в письмо какие-либо изменения.

Событие OnSuccess генерируется после того как сообщение успешно доставлено. Если сообщение не доставлено, то в этом случае наступает событие OnFailture.




компонент tnmurl [закладка fastnet]

Компонент TNMURL применяется для декодирования строк в формате URL в "стандартные" строки и кодирования символьных строк в строки формата URL, которые можно использовать в HTTP-запросах.


Кодирование выполняется по следующим правилам:

Все поля [переменные] отделяются знаком амперсанта "&"

Имена полей и данных разделяются знаком равенства "="

Пробелы заменяются на знак плюс "+"

Любой не алфавитно-цифровой символ преобразовывается в знак процента, за которым следует шестнадцатеричный код этого символа из таблицы ASCII. Например, знак минус будет выглядеть как "%2D"

Работать с этим компонентом очень просто. Нужно задать обрабатываемую строку в свойстве InputString, после чего выбрать нужное вам значение из свойства Encode, либо декодированное значение из свойства Decode. В случае возникновения исключительной ситуации произойдёт событие OnError. В свойство Decode записывается результата декодирования строки из свойства InputString. Если в InputString задана строка не формате URL, а обычная строка, то в свойство Decode она попадает в неизменном виде. В свойство Encode помещается преобразованная в формат URL строка из свойства InputString.




компонент tnmuuprocessor [закладка fastnet]

Компонент выполняет чисто техническую задачу кодирования и декодирования файлов по алгоритму MIME или UUEncodes. Файлы в закодированном виде создаются для передачи по сети. После их получения выполняется обратная задача - декодирование.


Чтобы компонент мог выполнить свою задачу, нужно в свойстве InputStream указать имя обрабатываемого потока, в свойстве Method выбрать метод кодирования/декодирования, в свойстве OutputStream указать выходной поток, а затем вызвать метод Encode или Decode для выполнения кодирования или декодирования соответственно. Свойство Method может принимать только два значения:

uuMime

uuCode

Потоки могут представлять файлы или области в динамической памяти.

Событие OnBeginEncode происходит перед началом кодирования потока. Событие OnEndEncode происходит перед завершением метода Encode. Событие OnBeginDecode и OnEndDecode генерируются аналогичным образом при выполнении оператора декодирования.




компонент tpowersock [закладка fastnet]

Компонент TPOWERSOCK является базовым классом для многих компонентом инструментальной панели FastNet. Вы можете так же использовать его как базовый класс для создания компонентов, использующих другие стандартные протоколы либо ваши собственные протоколы.


Разработчики не советуют использовать этот компонент сам по себе, а рекомендуют использовать его только как базовый класс и строить на его основе новые компоненты.

Если вы собираетесь создавать новые компоненты на основе компонента TPOWERSOCK, вам следует изучить исходный код этого компонента и более детально ознакомиться с его работой. Если у вас нет исходных кодов для компонентов из панели FastNet, зайдите на WEB-сайт компании NetMasters по адресу www.netmasters.com, где вы узнаете как их можно получить.





компонент tnmgeneralserver [закладка fastnet]

Компонент TNMGENERALSERVER предлагается как базовый класс для создания на его основе многопотоковых серверов Интернет, специфических корпоративных серверов или других серверов, работающих со стандартами RFC.


Создавая классы-потомки компонента TNMGENERALSERVER и переписывая метод Serve, вы можете создавать специфические серверы, обрабатывающие запросы клиентов нужным вам образом. Обмен данными с клиентом должен выполняться методами read/write или ReadLn/WriteLn, унаследованными от TPowerSock.

Метод Serve является виртуальным методом, который должен переопределяться в классах-потомках. Метод Serve вызывается всякий раз, когда клиент подключается к серверу. Метод Serve исполняется в отдельном потоке, поэтому использовать объекты VCL и другие методы внутри него нельзя.




компонент tnmudp [закладка fastnet]

Компонент TNMUDP используется для отправки пакетов по Интернет или Интранет с использованием протокола UDP [User Datagram Protocol], протокола пользовательских датаграм. Стандарт протокола описан в RFC 768.


Перед тем как отправлять пакеты датаграм, вам нужно задать имя удалённого компьютера и порт, на который вы будете посылать данные. Эти значения нужно присвоить свойствам RemoteHost и RemotePort соответственно. Далее можно отправлять данные одним из двух методов: метод SendBuffer отправляет на удалённый компьютер массив символов [или буфер данных], а метод SendStream занимается отправкой потоков данных. Для получения данных нужно указать значение для свойства LocalPort. Это свойство задаётся во время разработки и не может быть изменено во время выполнения, кроме случая, когда компонент создаётся динамически, с помощью метода Create. В последнем случае свойству LocalPort присвоить значение можно только один раз. Когда данные поступили их можно использовать, происходит событие OnDataAvailable. В обработчике этого события вы можете вызвать метод ReadBuffer и считать данные в буфер или метод ReadStream, чтобы поместить данные в поток. Упомянем, что свойство ReportLevel, которое определяет степень детализации, с которой событие OnStatus выдаёт свой отчёт. Значение по умолчанию Status_Informational. В качестве значений свойства могут выступать только следующие константы:

Status_None

Status_Informational

Status_Basic

Status_Routines

Status_Debug

Status_Trace

Теперь о методах этого компонента. Метод ReadBuffer считывает приходящие датаграммы и помещает их буфер. У метода есть два параметра: параметр Buff задаёт буфер, в который помешаются данные, второй параметр Length - размер данных. Нужно следить за тем, чтобы размер буфера был достаточным для размещения поступающих данных. Если вы пытаетесь записать в буфер данных больше, чем он может вместить, то произойдёт ошибка доступа к памяти.

Отправляют данные методы SendBuffer и SendStream. Первый применяется для отправки на сервер порции данных, записанных в буфер. У этого метода та же пара параметров, что у метода ReadBuffer. Если в массиве Buff нет данных, будет сгенерировано событие OnBufferInvalid. Метод SendStream отсылает поток на удалённый компьютер. Если поток DataStream не содержит данных, произойдёт событие OnStreamInvalid.

Событие OnDataReceived генерируется, когда получены данные от удалённого компьютера. Обработчик события имеет три параметра: в параметре NumberBytes находится количество пришедших байт данных, в параметре FromIP указывается IP-адрес компьютера, который прислал эти данные, и в параметре Port - порт, по которому отправляет свои датаграммы этот удалённый компьютер.

Событие OnDataSend наступает, когда данные успешно отправляются методом SendStream или методом SendBuffer. Нужно заметить, что если произошло событие OnDataSend, означающее успешную отправку данных, это не гарантирует, что данные действительно будут получены удалённым компьютером. Вызвано это тем, что сам протокол UDP не поддерживает контроль доставки данных.

Событие OnInvalidHost генерируется, если в свойстве RemoteHost сервер указан неправильно.




компоненты tnmstrm и tnmstrmserv [закладка fastnet]

Компоненты TNMSTRM И TNMSTRMSERV применяются для обмена так называемыми потоками. Первый компонент применяется для клиентской программы, а второй - для сервера потоков. Если клиентская программа должна поддерживать и приём потоков, то в неё нужно добавить второй серверный компонент.


Ранее мы рассматривали пару компонентов TNMMsg и TNMMsgServ, которые используются для обмена текстовыми сообщениями. Компоненты , которые мы рассматриваем сейчас, так же используются для обмена информацией, только область их применения несколько шире: данные могут не только текстового вида, но и двоичного. Эти компоненты могут использоваться для обмена любыми файлами . Как уже было сказано эти компоненты обмениваются не самими файлами, а потоками[streams].

Механизм потоков используется для работы с массивами данных, необязательно организованными в файлы. В том числе это может быть буфер в памяти, длинная строка символов и т.д. Во всех этих случаях доступ к данным напоминае6т работу с файлом. Есть соответствующие методы для записи и чтения данных. В Delphi имеются следующие классы потоков:

TFileStream

TStringStream

TMemoryStream

TBlobStream

TWinSocketStream

для работы с файловыми и строковыми потоками, потоками в динамической памяти, BLOB-потоками и сокетными соединениями соответственно. Все эти классы являются потомками класса TStream.

Перед тем как посылать поток, вы должны указать имя удалённого компьютера, на который вы собираетесь отправлять потоки. Кроме того, нужно в свойстве Port указать порт, соответствующий порту сервера потоков. В свойстве FromName нужно указать своё имя, чтобы получатель знал, от кого пришли данные. Только после того как будут заданы значения этим свойствам, вы сможете послать поток данных методом PostIt, указав его в параметре sStrm. Если сервер получил поток без ошибок, то метод возвращает OK в качестве ответа сервера. После отправки сообщения генерируется событие OnMessageSent.

Если вы хотите изменить значение порта по умолчанию, который слушает ваш сервер потоков, то во время разработки приложения вы это можете сделать в Инспекторе Объектов, изменив значение свойства Port.

Для обработки получаемых сервером потоков вам нужно написать обработчик события OnMSG, который вызывается, когда сервер получает очередной поток. Обработчик события имеет два параметра: параметр sFrom содержит имя отправителя сообщения, в параметре strm находится полученный поток. Помните, что когда вы выйдете из обработчика этого события, полученный поток будет потерян, поэтому вы обязательно должны взять данные из параметра strm и обработать их.




как захватить текущий url из окна internet explorer

Описываем две функции GetText и GetURL:


Function GetText(WindowHandle: hwnd):string;
var
txtLength : integer;
buffer: string;
begin
TxtLength := SendMessage(WindowHandle, WM_GETTEXTLENGTH, 0, 0);
txtlength := txtlength + 1;
setlength (buffer, txtlength);
sendmessage (WindowHandle,wm_gettext, txtlength, longint(@buffer[1]));
result := buffer;
end;

function GetURL:string;
var
ie,toolbar,combo,
comboboxex,edit,
worker,toolbarwindow:hwnd;
begin
ie := FindWindow(pchar('IEFrame'),nil);
worker := FindWindowEx(ie,0,'WorkerA',nil);
toolbar := FindWindowEx(worker,0,'rebarwindow32',nil);
comboboxex := FindWindowEx(toolbar, 0, 'comboboxex32', nil);
combo := FindWindowEx(comboboxex,0,'ComboBox',nil);
edit := FindWindowEx(combo,0,'Edit',nil);
toolbarwindow := FindWindowEx(comboboxex, 0, 'toolbarwindow32', nil);

result := GetText(edit);
end;

Ну а затем пользуемся функцией GetURL, например, можем в поле ввода по нажатию на кнопку выводит текущий URL:

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=GetURL;
end;




как захватить текущий url из окна internet explorer или netscape navigator

Приводимая здесь функция показывает, как Ваше приложение может извлечь из браузера (IE или Netscape) URL , как, например, это делает аська.

Совместимость: Delphi 4.x (или выше)

Не забудьте добавить DDEMan в Ваш проект!




uses windows, ddeman, ......


function Get_URL(Servicio: string): String;
var
Cliente_DDE: TDDEClientConv;
temp:PChar; //<<-------------------------This is new
begin
Result := '';
Cliente_DDE:= TDDEClientConv.Create( nil );
with Cliente_DDE do
begin
SetLink( Servicio,'WWW_GetWindowInfo');
temp := RequestData('0xFFFFFFFF');
Result := StrPas(temp);
StrDispose(temp); //<<-Предотвращаем утечку памяти
CloseLink;
end;
Cliente_DDE.Free;
end;

procedure TForm1.Button1Click(Sender);
begin
showmessage(Get_URL('Netscape'));
или
showmessage(Get_URL('IExplore'));
end;




как проверить правильность e-mail адреса

Если пользователю Вашего приложения необходимо вводить почтовый адрес, то возникает потребность в проверке адреса на правильность. Конечно способов сделать это существует множество, но этот, на мой взгляд, самый короткий и доступный для понимания.





function IsValidEmail(const Value: string): boolean;
function CheckAllowed(const s: string): boolean;
var
i: integer;
begin
Result:= false;
for i:= 1 to Length(s) do
begin
{ недопустимый символ в s - значит недопустимый адрес }
if not (s[i] in ['a'..'z', 'A'..'Z', '0'..'9', '_', '-', '.']) then
Exit;
end;
Result:= true;
end;
var
i: integer;
namePart, serverPart: string;
begin // начало выполнения IsValidEmail
Result:= false;
i:= Pos('@', Value);
if i = 0 then
Exit;
namePart:= Copy(Value, 1, i - 1);
serverPart:= Copy(Value, i + 1, Length(Value));
// @ не указано имя имя или сервер не указаны; минимально для сервера. "a.com"
if (Length(namePart) = 0) or ((Length(serverPart) < 5)) then
Exit;
i:= Pos('.', serverPart);
// должно иметь точку и как минимум три знака от конца
if (i = 0) or (i > (Length(serverPart) - 2)) then
Exit;
Result:= CheckAllowed(namePart) and CheckAllowed(serverPart);
end;


--------------------------------------------------------------------------------




преобразуем доменное имя в ip-адрес

Описывается функция, которая показывает, как вычислить IP адрес компьютера в интернете по его доменному имени.

Совместимость: Delphi 3.x (или выше)

Объявляем Winsock, для использования в функции


function HostToIP(Name: string; var Ip: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
WSAStartup ($0101, wsdata);
try
gethostname (hostName, sizeof (hostName));
StrPCopy(hostName, Name);
hostEnt := gethostbyname (hostName);
if Assigned (hostEnt) then
if Assigned (hostEnt^.h_addr_list) then begin
addr := hostEnt^.h_addr_list^;
if Assigned (addr) then begin
IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
Result := True;
end
else
Result := False;
end
else
Result := False
else begin
Result := False;
end;
finally
WSACleanup;
end
end;

Вы можете разместить на форме Edit, Кнопку и Label и добавить к кнопке следующий обработчик события OnClick:

procedure TForm1.Button1Click(Sender: TObject);
var
IP: string;
begin
if HostToIp(Edit1.Text, IP) then Label1.Caption := IP;
end;


--------------------------------------------------------------------------------




порты

Здесь приводится список номеров портов и показывается за каким портом какая служба закреплена:


7 echo
9 discard
11 systat
13 daytime
15 netstat
17 qotd
19 chargen
20 ftp-data
21 ftp
23 telnet
25 smtp
37 time
39 rlp
42 name
43 whois
53 domain 57 mtp
67 bootp
69 tftp
77 rje
79 finger
87 link
95 supdup
101 hostnames
102 iso-tsap
103 dictionary
104 x400-snd
105 csnet-ns
109 pop
110 pop3
111 portmap
113 auth 115 sftp
117 path
119 nntp
123 ntp
137 nbname
138 nbdatagram
139 nbsession
144 NeWS
153 sgmp
158 tcprepo
161 snmp
162 snmp-trap
170 print-srv
175 vmnet
315 load
400 vmnet0 500 sytek
512 biff
513 login
514 shell
515 printer
517 talk
518 ntalk
520 efs
525 timed
526 tempo
530 courier
531 conference
532 netnews
533 netwall
540 uucp
543 klogin 544 kshell
550 new-rwho
556 remotefs
560 rmonitor
561 monitor
600 garcon
601 maitrd
602 busboy
700 acctmaster
701 acctslave
702 acct
703 acctlogin
704 acctprinter
705 acctinfo
706 acctslave2
707 acctdisk 750 kerberos
751 kerberos_master
752 passwd_server
753 userreg_server
754 krb_prop
888 erlogin






ARP [Address Resolution Protocol]

Для определения локального адреса по IP-адресу используется протокол разрешения адреса Address Resolution Protocol, ARP. Протокол ARP работает различным образом в зависимости от того, какой протокол канального уровня работает в данной сети - протокол локальной сети (Ethernet, Token Ring, FDDI) с возможностью широковещательного доступа одновременно ко всем узлам сети, или же протокол глобальной сети (X.25, frame relay), как правило не поддерживающий широковещательный доступ. Существует также протокол, решающий обратную задачу - нахождение IP-адреса по известному локальному адресу. Он называется реверсивный ARP - RARP (Reverse Address Resolution Protocol) и используется при старте бездисковых станций, не знающих в начальный момент своего IP-адреса, но знающих адрес своего сетевого адаптера.

В локальных сетях протокол ARP использует широковещательные кадры протокола канального уровня для поиска в сети узла с заданным IP-адресом.

Узел, которому нужно выполнить отображение IP-адреса на локальный адрес, формирует ARP запрос, вкладывает его в кадр протокола канального уровня, указывая в нем известный IP-адрес, и рассылает запрос широковещательно. Все узлы локальной сети получают ARP запрос и сравнивают указанный там IP-адрес с собственным. В случае их совпадения узел формирует ARP-ответ, в котором указывает свой IP-адрес и свой локальный адрес и отправляет его уже направленно, так как в ARP запросе отправитель указывает свой локальный адрес. ARP-запросы и ответы используют один и тот же формат пакета. Так как локальные адреса могут в различных типах сетей иметь различную длину, то формат пакета протокола ARP зависит от типа сети.

В поле типа сети для сетей Ethernet указывается значение 1. Поле типа протокола позволяет использовать пакеты ARP не только для протокола IP, но и для других сетевых протоколов. Для IP значение этого поля равно 080016.

Длина локального адреса для протокола Ethernet равна 6 байтам, а длина IP-адреса - 4 байтам. В поле операции для ARP запросов указывается значение 1 для протокола ARP и 2 для протокола RARP.

Узел, отправляющий ARP-запрос, заполняет в пакете все поля, кроме поля искомого локального адреса (для RARP-запроса не указывается искомый IP-адрес). Значение этого поля заполняется узлом, опознавшим свой IP-адрес.

В глобальных сетях администратору сети чаще всего приходится вручную формировать ARP-таблицы, в которых он задает, например, соответствие IP-адреса адресу узла сети X.25, который имеет смысл локального адреса. В последнее время наметилась тенденция автоматизации работы протокола ARP и в глобальных сетях. Для этой цели среди всех маршрутизаторов, подключенных к какой-либо глобальной сети, выделяется специальный маршрутизатор, который ведет ARP-таблицу для всех остальных узлов и маршрутизаторов этой сети. При таком централизованном подходе для всех узлов и маршрутизаторов вручную нужно задать только IP-адрес и локальный адрес выделенного маршрутизатора. Затем каждый узел и маршрутизатор регистрирует свои адреса в выделенном маршрутизаторе, а при необходимости установления соответствия между IP-адресом и локальным адресом узел обращается к выделенному маршрутизатору с запросом и автоматически получает ответ без участия администратора.



DNS [Domain Name System]

Служба Доменных Имен предназначена для того, чтобы машины, работающие в Internet, могли по доменному имени узнать IP-адрес нужной им машины, а также некоторую другую информацию; а по IP-номеру могли узнать доменное имя машины.

Служба Доменных Имен была разработана для именования машин в глобальной сети. Основной особенностью глобальной сети является распределенное администрирование, когда один администратор физически не может уследить за выделением имен. Поэтому Служба Доменных Имен функционирует на принципе делегирования полномочий. Каждая машина либо знает ответ на вопрос, либо знает кого спросить. При правильном функционировании система замкнута, т.е. если запрошенная информация имеется у кого-либо, то она будет найдена и сообщена клиенту, либо, если вопрос не имеет ответа, клиент получит сообщение о невозможности получения ответа на вопрос.

Каждый клиент знает своего сервера; обычно указывается не один, а несколько серверов - если первый не отвечает, клиент обращается ко второму и так далее до исчерпания списка. В принципе неважно, к какому серверу обращаться - они дают (должны давать при правильном функционировании) одинаковые ответы на любой запрос. Поэтому для ускорения работы обычно указывают ближайший. Следует помнить, что на одной машине могут функционировать одновременно Name-сервер и программы-клиенты; поэтому если на машине запущен Name-сервер, то в качестве Name-сервера на ней должен быть прописан "я сам".

Имеется некий домен верхнего уровня, обозначаемый точкой: ".". Имеется девять серверов (по крайней мере на моем Name-сервере записано столько), которые отвечают за эту зону. Они не знают ни одного доменного имени - они только авторизуют серверы верхних зон. Серверы верхних зон тоже гнушаются хранить информацию о конкретных машинах и передают это право нижележащим серверам. Тут уже появляются первые упоминания о конкретных машинах, равно как и происходит авторизация нижележащих серверов.

Мне неизвестна ни одна машина с доменным именем из одного сегмента; очень редко используются доменные имена из двух сегментов; имена из трех и четырех сегментов составляют подавляющую долю всех имен Internet; имена из пяти сегментов встречаются довольно редко, а из шести и более мне неизвестны.

Допустим, клиент запросил адрес "www.организация.город.страна". Поиск информации по доменному имени происходит следующим образом:

Клиент спрашивает своего сервера.
Если тот является сервером данной зоны, то ответит, на чем все заканчивается.
Сервер спрашивает корневой сервер.
Тот не может ответить, потому что не знает; зато знает, какой сервер отвечают за зону "страна".
Сервер зоны "страна" тоже не может ответить, но знает, что нужно спросить сервер зоны "город.страна".
Тот в свою очередь отсылает запрос серверу зоны "организация.город.страна", который сообщит нужную информацию.
Это приближенная модель, которая тем не менее позволяет представить работу системы DNS.
Однако эту стройную картину искажают системы кэширования и вторичных серверов. Дело в том, что получив ответ на свой вопрос, DNS-сервер получает также некоторое число, которое говорит ему о том, по истечении какого времени эта информация должна считаться устаревшей. Таким образом, все серверы, участвовавшие в поиске ответа на вопрос, заданный клиентом, могут (и скорее всего будут) помнить как ответ на заданный вопрос, так и путь, по которому шел поиск. При следующих запросах, имеющих общую правую часть с недавно сделанными запросами, поиск будет упрощен (ускорен).

Кроме того, большинство зон имеет вторичные серверы, которые содержат копии данных с первичных серверов. Сервер вышележащей зоны может направить запрос как первичному серверу, так и любому из вторичных, основываясь на своих соображениях о том, какой из них ближе.

Хочу обратить особое внимание на сходство, различие и взаимодействие систем DNS и IP-маршрутизации. Как и IP-маршрутизация, DNS работает по принципу делегирования полномочий, но выделение доменных имен совершенно не зависит от выделения IP-адресов. Для примера рассмотрим домен freebsd.org. Это - домен организации, занимающейся распространением операционной системы FreeBSD Unix. FTP-сервер, содержащий дистрибутив операционной системы и множества утилит для нее, имеет копии в нескольких десятках стран. Имена серверов выглядят так:

ftp.freebsd.org - первичный сервер в США
ftp.страна.freebsd.org - основной сервер в стране
ftpчисло.страна.freebsd.org - дополнительный сервер в стране
Так например на 11 февраля 1998 года
ftp.ru.freebsd.org соответствует ftp.ru
ftp2.ru.freebsd.org соответствует ftp.gamma.ru
ftp3.ru.freebsd.org соответствует ftp.chg.ru
Таким образом, машины, находящиеся в России оказались произвольно (по воле DNS-мастера из университета Bercley) включенными в домен freebsd.org; однако, они также состоят в своих зонах. Система DNS позволяет любому DNS-мастеру включить любой сервер в свою зону, хотя это включение никого ни к чему не обязывает.
Однако, некоторым сервисам этого недостаточно - так E-mail требует, чтобы машина, принимающая письмо, признала своим адрес, указанный в качестве пункта назначения. Протокол HTTP 1.1 (в 1.0 этого не было) требует, чтобы в HTTP-запросе указывался не путь к файлу, отсчитанный от корня сервера (хотя такие запросы тоже признаются), но и имя сервера; при этом сам сервер знает, какие имена - его, а остальные обрезает и обслуживает в соответствии с HTTP 1.0.

Делегирование зоны ...in-addr.arpa дается только от провайдера вместе с IP-адресами. Собственно, это связано с предназначением ReverceDNS - сообщать доменное имя по IP-адресу. Наверняка мастер зоны freebsd.org держит Reverce-зону для IP-номеров, выделенных университету Bercley; но все эти серверы (кроме сервера, расположенного в университете) не входят в эту Reverce-зону, а значит, ему неподконтрольны.

Одна из проблем состит в том, что Reverce-зону можно выделить только на сеть класса A, B или C (на 16777216, 65536 или 256 адресов) и никак иначе. Можно получить правА на несколько зон одного или разных классов, но что делать тем, кому выделили меньше 256 адресов? А ведь в условиях исчерпания адресного пространства не редкость выделения пула уже на 16 адресов!

DNS-услуги Internet-провайдера
Как правило, провайдер предоставляет клиенту целый комплекс услуг. В число оказываемых DNS-услуг входят:
делегирование зоны ...in-addr.arpa клиентам, имеющим пул адресов, кратный 256.
регистрация доменного имени клиента у держателя той зоны, в которой клиент хочет зарегистрироваться;
поддержание вторичного сервера прямой и обратной DNS-зон клиента;
поддержание первичного сервера этих зон, если клиент по какой-либо причине не поддерживает их сам (особенно это относится к случаю виртуальных зон и к случаю выделения малого пула адресов);
Если провайдер будет отказываться - сошлитесь на меня. :-)
Политика и стратегия назначения имен
Имена зон условно можно разделить на "организационные" и "географические". В высшей зоне зарегестрированы следующие "организационные" зоны:
com - commercial (коммерческие)
edu - educational (образовательные)
gov - goverment (правительственные)
mil - military (военные)
net - network (организации, обеспечивающие работу сети)
org - organization (некоммерческие организации)
В данный момент, чтобы разгрузить домен com, собираются создать несколько новых доменов, но у меня нет достоверной информации по ним. В организационных зонах обычно размещаются непосредственно домены организаций.
Каждая страна (государство) имеет свой географический домен из двух букв:

ae - United Arab Emirates (Объединенные Арабские Эмираты)
au - Australia (Австралия)
be - Belgium (Бельгия)
br - Brazil (Бразилия)
by - Belarus (Белоруссия)
ca - Canada (Канада)
ch - Switzerland (Швейцария)
cz - Czech Republic (Чехия)
de - Germany (Германия)
dk - Denmark
do - Dominican Republic (Доминиканская республика)
ee - Estonia (Эстония)
eo - ???
es - Spain (Испания)
fi - Finland (Финляндия)
fr - France (Франция)
hu - Hungary (Венгрия)
il - Israel (Израиль)
in - India (Индия)
iz - ???
jp - Japan (Япония)
kg - Kyrgyzstan (Кыргызстан)
kr - South Korea (Южная Корея)
kz - Kazakhstan (Казахстан)
lt - Lithuania (Литва)
lv - Latvia (Латвия)
mx - Mexico (Мексика)
nl - Netherlands (Нидерланды)
no - Norway (Норвегия)
nz - New Zealand (Новая Зеландия)
pl - Poland (Польша)
ro - Romania (Румыния)
ru - Russia (Россия)
si - Slovenia (Словения)
sk - Slovak Republic (Словакия)
su - Soviet Union (Советский Союз - поддерживается, но не распределяется)
ua - Ukraine (Украина)
uk - United Kingdom (Соединенное Королевство ВеликоБритания / Англия)
yu - Yugoslavia (Югославия)
za - South Africa (Южная Африка)
Я перечислил отнюдь не все страны - кто хочет, может прислать мне другие названия.
В зонах государств опять же имеются "организационные" и "географические" зоны. "Организационные" в большинстве своем повторяют структуру "организационных" зон верхнего уровня, разве что вместо "com" используется "co". "Географические" выделяются городам, областям и т.п. территориальным образованиям. Непосредственно в тех и других размещаются домены организаций или домены персональных пользователей.


После выбора зоны, в которую будет включен наш домен надо выбрать собственное имя домена. Обычно это имя компании, торговая марка или что-нибудь столь же характерное. Для неанглоязычных стран используется транскрипция имен. Часто возникают конфликты, связанные с тем, что одно и то же имя используется несколькими фирмами (законодательство допускает это для фирм, работающих в разных отраслях); многие люди заранее резервируют имена, могущие стать популярными для последующей продажи их владельцу торговой марки; но это уже касается юридической стороны функционирования Internet и не входит в мою компетенцию.


С левого конца доменного имени находятся имена машин. Имена бывают "собственные" и "функциональные". Имена "собственные" каждый придумавает в меру фантазии: машинам присваиваются имена членов семьи, животных, растений, музыкантов и артистов, литературных персонажей - кто во что горазд.

Имена "функциональные" вытекают из функций, выполняемых машиной:

www - HTTP (WWW) сервер
ftp - FTP сервер
ns, nss, dns - DNS (Name) сервер
mail - Mail сервер
relay - Mail Exchanger
*proxy - соответствующий Proxy сервер
Я считаю нежелательным присваивать какой-либо машине функциональное имя - в любой момент может потребоваться перенести соответствующую функцию на другую машину. Для этого лучше всего использовать псевдонимы, которые перенаправляют запросы к данному имени на записи, относящиеся к другому имени. Но вот ссылаться на псевдонимы при обьявлении Mail Exchanger'ов и вообще использовать их в правой части записей считается нежелательным, а зачастую является недопустимым.





ICMP [Internet Control Message Protocol]

Протокол Internet (IP) используется для обработки датаграммы, передаваемой между хост-компьютерами в системе объединенных сетей, называемой Catenet. Устройства, осуществляющие соединение различных сетей, называются шлюзами. Для обеспечения управления шлюзы общаются друг с другом посредством протокола Gateway to Gateway Protocol (GGP). Порой шлюз или хост-компьютер, получающий данные, обменивается информацией с хост-компьютером, отправляющим эти данные. Именно для таких целей используется данный протокол - протокол контрольных сообщений Internet (ICMP). ICMP использует основные свойства протокола Internet (IP), как если бы ICMP являлся протоколом более высокого уровня. Однако фактически ICMP является составной частью протокола Internet и должен являться составной частью каждого модуля IP.

Сообщения ICMP должны отправляться в некоторых затруднительных ситуациях. Например, когда датаграмма не может достичь своего адресата, когда шлюз не имеет достаточно места в своем буфере для передачи какой-либо датаграммы, или когда шлюз приказывает хост-компьютеру отправлять информацию по более короткому маршруту.

Протокол Internet не создан для того, чтобы обеспечивать абсолютную надежность передачи информации. Целью же данных контрольных сообщений является обеспечение обратной связи, оповещение отправителя данных о проблемах, возникающих в коммуникационном оборудовании. Их целью не является придание надежности протоколу IP. Протокол не дает гарантий, что датаграмма достигает своего адресата или что контрольное сообщение будет возвращено компьютеру, отправившему данные. Некоторые из датаграмм могут исчезнуть в сети, не вызвав при этом ни каких оповещений. Протоколы более высокого уровня, использующие протокол IP, должны применять свои собственные процедуры для обеспечения надежности передачи данных, если таковая требуется.

Сообщения ICMP протокола, как правило, оповещают об ошибках, возникающих при обработке датаграмм. Чтобы проблемы с передачей сообщений не вызывали появление новых сообщений, чтобы это в свою очередь не привело к лавинообразному росту количества сообщений, циркулирующих в сети, констатируется, что нельзя посылать сообщения о сообщениях. Также констатируется, что ICMP сообщения можно посылать только о проблемах, возникающих при обработке нулевого фрагмента в сегментированной датаграмме (нулевой фрагмент имеет нуль в поле смещения фрагмента).

Форматы сообщений

ICMP сообщения посылаются с помощью стандартного IP заголовка. Первый октет в поле данных датаграммы - это поле типа ICMP сообщения. Значение этого поля определяет формат всех остальных данных в датаграмме. Любое поле, которое помечено "unused", зарегистрировано для последующих разработок и должно при отправлении содержать нули. Однако получатель не должен использовать значения этих полей (за исключением процедуры вычисления контрольной суммы). Если обратное особо не оговорено при описании отдельных фрагментов, Internet заголовок должен иметь в своих полях следующие значения:

Версия
4

IHL
Длина Internet заголовка; единица измерения - 32-битное слово.
Тип сервиса
0

Общая длина
Длина Internet заголовка и поля данных в октетах.
Идентификация, флаги, смещение фрагмента
Используются в случае фрагментации
Время жизни
Время жизни в секундах. Поскольку значение этого поля уменьшается на единицу в каждой машине, на которой обрабатывается данная датаграмма, то значение этого поля должно, по крайней мере, превышать количество шлюзов, через которые будет проходить данная датаграмма.

Протокол
ICMP=1
Контрольная сумма заголовка
16-битное дополнение до единицы суммы дополнений до единицы всех 16-битных слов в заголовке. При вычислении данной суммы следует первоначально устанавливать значение этого поля в нуль.
В дальнейшем этот алгоритм вычисления контрольной суммы должен быть изменен.
Адрес отправления
Адрес шлюза или хост-компьютера, который составил данное ICMP сообщение. Если не оговорено обратное, в этом поле может находиться любой из адресов шлюза.
Адрес получателя
Адрес шлюза или хост-компьютера, которому следует послать данное сообщение.


Сообщение о недостижимости порта

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Тип Код Контрольная сумма
не используется
Internet заголовок + 64 бита данных из исходной датаграммы

Поля Internet протокола:
Адрес получателя
Локальная сеть и адрес компьютера, отправившего исходную датаграмму

Поля ICMP протокола
Тип
3

Код0 невозможно передать датаграмму на локальную сеть, где находится адресат
1 невозможно передать датаграмму на хост-компьютер, являющийся адресатом
2 нельзя воспользоваться указанным протоколом
3 нельзя передать данные на указанный порт
4 для передачи датаграммы по сети требуется фрагментация, однако выставлен флаг DF.
5 сбой в маршрутизации при отправлении


Контрольная сумма
Контрольная сумма является 16-битным дополнением до единицы суммы дополнений октетов в полях ICMP сообщения, начиная с поля типа ICMP. Для вычисления контрольной суммы первоначально значение этого поля обнуляется. В будущем процедура вычисления контрольной суммы может быть изменена.

Internet заголовок + 64 бита данных из исходной датаграммы
Данное поле содержит Internet заголовок и первые 64 бита данных из исходной датаграммы для выработки сообщения для соответствующего процесса. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера находятся в первых 64 битах поля данных.

Описание
Если, согласно информации в таблицах маршрутизации шлюза, локальная сеть, указанная в Internet заголовке датаграммы в поле адресата, является недостижимой, например, из-за ее чрезмерной удаленности, то шлюз может послать хост-компьютеру, отправившему датаграмму по Internet сети, сообщение о недостижимости адресата.

Кроме этого, в некоторых сетях шлюз может иметь возможность определять доступность отдельного хост-компьютера. Шлюз в такой сети может послать данное сообщение, если хост-компьютер, являющийся адресатом, недоступен.

Иная ситуация возникает, когда для достижения адресата датаграмма должна быть разбита шлюзом на отдельные фрагменты, но установлен флаг запрета фрагментации. О этом случае шлюз обязан ликвидировать датаграмму и может при этом послать сообщение о недостижимости адресата.

Шлюз может послать сообщения с кодами 0, 1, 4 и 5. Хост-компьютер может послать сообщения с кодами 2 и 3.

Сообщение о превышении контрольного времени

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Тип Код Контрольная сумма
не используется
Internet заголовок + 64 бита данных из исходной датаграммы

Поля IP заголовка
Заимствованы сеть и адрес отправителя из исходной датаграммы с данными. Поля ICMP сообщения
Тип
11

Код0 при передаче превышено время жизни
1 превышено контрольное время при сборке фрагментов датаграммы


Контрольная сумма
Контрольная сумма является 16-битным дополнением до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP.

При вычислении суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм контрольной суммы может быть изменен.

Internet заголовок + 64 бита данных из исходной датаграммы
Internet заголовок плюс первые 64 бита данных из исходной датаграммы. Эти биты данных используются хост-компьютером для привязки сообщения к соответствующему процессу. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера входят в первые 64 бита данных в исходной датаграмме.

Описание
Если фрагмент нулевого размера превысил контрольное время, то сообщение в этом не посылается вовсе.

Шлюз может послать сообщение с кодом 0, а хост - с кодом 1.

Сообщение о проблемах с параметром

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Тип Код Контрольная сумма
указатель не используется
Internet заголовок + 64 бита данных из исходной датаграммы

Поля IP заголовка
Заимствованы сеть и адрес отправителя из исходной датаграммы с данными. Поля ICMP сообщения
Тип
12

Код
0 - указатель показывает ошибку

Контрольная сумма
Контрольная сумма является 16-битным дополнением до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP.

При вычислении суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм вычисления контрольной суммы может быть изменен.

Указатель
Если код = 0, то он указывает на октет, где была обнаружена ошибка.
Internet заголовок + 64 бита данных из исходной датаграммы
Эти биты данных используются хост-компьютером для привязки сообщения к соответствующему процессу. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера входят в первые 64 бита данных в исходной датаграмме.

Описание
Если шлюз или хост-компьютер, обрабатывающий датаграмму, обнаруживает проблему с обработкой параметров заголовка, и это не позволяет завершить ее обработку, то он должен ликвидировать рассматриваемую датаграмму. Одной из потенциальных причин такой неприятности могут бить неправильные аргументы в опции. Шлюз или хост-компьютер в сообщении о проблеме с параметрами может также упомянуть хост-компьютер, породивший датаграмму с ошибкой. Сообщения такого типа посылаются лишь в том случае, если ошибка приводит к ликвидации этой датаграммы.

Указатель определяет октет в заголовке исходной датаграммы, где была обнаружена ошибка (этот ошибочный октет может находиться даже посередине опции). Например, 1 указывает на то, что имеется какая-то ошибка в поле типа сервиса, а (если имеются опции) 20 определяет, что имеется ошибка в коде типа для первой опции. Код 0 сообщения может приходить как от шлюза, так и от хост-компьютера.

Сообщение для приостановки отправителя

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Тип Код Контрольная сумма
не используется
Internet заголовок + 64 бита данных из исходной датаграммы

Поля IP заголовка
Заимствованы сеть и адрес отправителя из исходной датаграммы с данными.

Поля ICMP сообщения
Тип
4

Код
0

Контрольная сумма
Контрольная сумма является 16-битным дополнением до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP. При вычислении контрольной суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм вычисления контрольной суммы может быть изменен.
Internet заголовок + 64 бита данных из исходной датаграммы
Internet заголовок плюс первые 64 бита данных из исходной датаграммы. Эти данные используются хост-компьютером для привязки сообщения к соответствующему процессу. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера входят в первые 64 бита данных исходной датаграммы.

Описание
Шлюз может ликвидировать Internet датаграммы, если у него нет места в буфере для постановки этих датаграмм в очередь на от правление в очередную сеть по маршруту следования к адресату.

Если шлюз ликвидирует датаграмму, то он должен послать сообщение для приостановки хост-компьютеру в Internet системе, отправившему данную датаграмму. Сообщение о приостановке может послать также сам адресат, если датаграммы приходят слишком быстро, чтобы успеть их обработать. Сообщение о приостановке является за просом для хост-компьютера уменьшить скорость посылки данных на этот конкретный адрес. Шлюз может посылать сообщение для при остановки отправителя в каждом случае ликвидации. При получении такого сообщения хост-компьютер, отправивший данные, должен уменьшить скорость посылки данных по этому адресу до тех пор, пока не перестанут приходить запросы на приостановку с данного шлюза. После этого хост-компьютер, отправляющий данные, может постепенно увеличивать скорость посылки данных по этому адресу, пока вновь не станут приходить сообщения о приостановке.

Шлюз или хост-компьютер может посылать сообщение о приостановке еще до достижения предельной пропускной способности, и не ждать, пока этот предел будет пройден. Это означает, что датаграмма с данными, вызвавшая появление сообщения о приостановке, все же может достичь своего адресата. И шлюз и хост-компьютер могут отправить сообщение с кодом 0.

Сообщение о переадресации

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Тип Код Контрольная сумма
Internet адрес шлюза
Internet заголовок + 64 бита данных из исходной датаграммы

Поля IP заголовка
Заимствованы сеть и адрес отправителя из исходной датаграммы с данными.

Поля ICMP сообщения
Тип
5

Код0 - переадресация датаграмм для сети
1 - переадресация датаграмм для хост-компьютера
2 - переадресация датаграмм для типа услуг и сети
3 - переадресация датаграмм для типа услуг и хост-компьютера


Контрольная сумма
Контрольная сумма - это 16-битное дополнение до единицы суммы дополнений в ICMP сообщении, начиная с поля типа ICMP. При вычислении контрольной суммы следует сперва обнулить поле контрольной суммы. В будущем алгоритм вычисления контрольной суммы может быть изменен.

Internet адрес шлюза
Адрес шлюза, на который должен быть проложен маршрут к сети, указанной в поле адреса в исходной датаграмме с данными.

Internet заголовок + 64 бита данных из исходной датаграммы
Internet заголовок плюс первые 64 бита данных из исходной датаграммы. Эти данные используются хост-компьютером для привязки сообщения к соответствующему процессу. Если протокол более высокого уровня использует номера портов, то предполагается, что эти номера входят в первые 64 бита данных исход ной датаграммы.

Описание
Шлюз посылает сообщение на хост-компьютер о переадресации в следующей ситуации: Шлюз G1 получает Internet датаграмму от хост-компьютера в сети, где он расположен. Шлюз G1 проверяет таблицу маршрутизации и находит адрес следующего шлюза G2 в качестве маршрута для датаграммы по пути в сеть X, где расположен ее адресат. Если G2 и исходный хост-компьютер идентифицируются Internet адресом как находящиеся в одной и той же сети, то на хост-компьютер следует послать сообщение о переадресации. Сообщение о переадресации заставляет хост-компьютер посылать датаграммы для сети X прямо на шлюз G2, поскольку это более короткий путь, нежели привлекать еще шлюз G1. Шлюз передает данные исходной датаграммы их адресату в системе Internet.

Для датаграмм с опциями IP маршрутизации отправления и адресом шлюза в поле получателя сообщение не посылается, даже если и существует более оптимальный маршрут к конечному адресату, чем следующий адрес, указанный в такой опции маршрута.

Шлюзом могут быть переданы сообщения с кодами 0, 1, 2 и 3.

Эхо-сообщение и сообщение в ответ на эхо

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Тип Код Контрольная сумма
Идентификатор Номер очереди
Данные .....

Поля IP заголовка
Адреса
Адрес отправителя в эхо-сообщении будет адресом получателя в ответном сообщении. Чтобы сформировать сообщение ответа, следует просто переставить местами адреса отправителя и получателя, код типа изменить на 0 и пересчитать контрольную сумму.

Поля ICMP сообщения
Тип8 - эхо-сообщение
0 - сообщение в ответ на эхо


Код
0

Контрольная сумма
Контрольная сумма - это 16-битное дополнение до единицы суммы дополнений для ICMP сообщения, начиная с поля типа ICMP.

При вычислении контрольной суммы это поле должно быть сперва обнулено. Если общая длина сообщения нечетная, то для вычисления контрольной суммы поле данных дополняется еще одним нулевым октетом. В будущем алгоритм вычисления контрольной суммы может быть изменен.

Идентификатор
Если код = 0, то идентификатор для соотнесения эхо-сообщений и ответов на них, должен быть обнулен.

Номер очереди
Если код = 0, то номер очереди, служащий для соотнесения эхо-сообщений и ответов на них, должен быть обнулен.

Описание
Данные из эхо-сообщения должны быть переданы в ответе на это сообщение.

Идентификатор и номер очереди может использоваться отправителем эхо-сообщения с целью идентификации приходящих пакетов. На пример, идентификатор может использоваться в качестве порта подобно протоколам TCP и UDP для идентификации сеанса. Номер очереди может увеличиваться на единицу при посылке каждого эхо сообщения (запроса). Компьютер, отозвавшийся на это сообщение, возвращает в своем ответе те же значения для идентификатора и номера очереди, что были в исходном эхо-сообщении.

Как шлюз, так и хост-компьютер могут возвращать сообщение с кодом 0.

Сообщение со штампом времени и сообщение с ответом на штамп времени

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Тип Код Контрольная сумма
Идентификатор Номер очереди
Штамп времени отправления
Штамп времени получения
Штамп времени передачи

Поля IP заголовка
Адреса
Адрес отправителя в сообщении со штампом времени будет адресом получателя в сообщении с ответом. Чтобы сформировать ответ на сообщение, следует просто поменять местами адреса отправителя и получателя, выбрать код типа 14, а также пересчитать контрольную сумму.

Поля ICMP сообщения
Тип13 для сообщения со штампом времени
14 для ответа на сообщение со штампом времени


Код
0

Контрольная сумма
Контрольная сумма - это 16-битное дополнение до единицы суммы дополнений для ICMP сообщения, начиная с поля типа ICMP.

При вычислении контрольной суммы это поле должно быть сперва обнулено. В будущем алгоритм вычисления контрольной суммы может быть изменен.

Идентификатор
Если код = 0, то идентификатор, служащий для соотнесения сообщений со штампом времени и ответов на них, должен быть обнулен.

Номер очереди
Если код = 0, то номер очереди, служащий для соотнесения сообщений со штампом времени и ответов на них, должен быть обнулен.

Описание
Данные из сообщения (штамп времени) возвращаются вместе с ответом, при этом в них добавляется еще один штамп времени. Штамп времени - это 32 бита, где записано время в миллисекундах, прошедшее после полуночи по единому времени (UT). Один из примеров использования таких временных штампов приведен в документе.

Штамп времени отправления - это время, которое отправитель фиксировал последний раз перед посылкой сообщения. Штамп времени получения - это время, когда исходное сообщение впервые увидел получатель первоначального сообщения. Штамп времени передачи - это время, которое фиксировал в последний раз компьютер, отправляющий ответное сообщение.

Если нет возможности измерять время в миллисекундах или нельзя определить единое время (UT), то в штамп все же можно занести имеющееся время, снабдив его единицей в старшем бите. Последнее также указывает на запись нестандартного значения в этом поле.

Идентификатор и номер очереди могут использоваться отправителем для соотнесения сообщений (запросов) и ответов на них. На пример, идентификатор может использоваться в качестве порта, аналогично протоколам TCP и UDP, для идентификации сессии. Номер очереди может увеличиваться на единицу при каждой посылке сообщения (запроса). Адресат возвращает для этих параметров те значения, которые были обнаружены в запросе. И шлюз и хост-компьютер могут возвращать сообщения с кодом 0.

Запрос информации и ответное сообщение с информацией

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Тип Код Контрольная сумма
Идентификатор Номер очереди

Поля IP заголовка
Адреса
Адрес отправителя в сообщении с запросом информации окажется адресом получателя в ответном сообщении с информацией. Чтобы сформировать ответное сообщение, следует просто поменять местами адреса отправителя и получателя, код типа сменить на 16, пересчитать контрольную сумму.

Поля ICMP сообщения
Тип15 - сообщение с запросом информации
16 - ответное сообщение с информацией


Код
0

Контрольная сумма
Контрольная сумма - это 16-битное дополнение до единицы суммы дополнений для ICMP сообщения, начиная с поля типа ICMP. При вычислении контрольной суммы следует предварительно обнулить поле самой контрольной суммы. В будущем алгоритм вычисления контрольной суммы может быть изменен.

Идентификатор
Если код = 0, то идентификатор, служащий для соотнесения запросов и ответов, может быть обнулен.

Номер очереди
Если код = 0, то номер очереди, служащий для соотнесения запросов и ответов, может быть обнулен.

Описание
Данное сообщение может быть послано, когда в IP заголовке в полях отправителя и получателя записаны нули (это означает "именно эту" локальную сеть). В ответ должен быть послан IP модуль с полностью заданными адресами. Данное сообщение является способом, с помощью которого хост-компьютер сможет определить номер сети, куда он подключен.

Отправитель сообщений может использовать идентификатор и номер очереди для соотнесения запросов и пришедших ответов. Например, идентификатор может использоваться как порт в протоколах TCP и UDP для идентификации сеанса. Номер очереди может увеличиваться на единицу всякий раз, когда посылается запрос. Адресат возвращает в ответе те же значения этих параметров, которые были обнаружены в запросе.

И хост-компьютер и шлюз могут возвращать сообщения с кодом 0.

Список типов сообщений

0 ответ на запрос эхо
3 адресат недостижим
4 приостановка отправителя
5 переадресация
8 эхо-запрос
11 превышение контрольного времени
12 проблемы с параметрами
13 штамп времени
14 ответ на запрос штампа времени
15 запрос информации
16 ответ на запрос информации




--------------------------------------------------------------------------------




SNMP [Simple Network Management Protocol]

Все серьезные системы управления сетями используют для своей работы простой сетевой протокол управления (Simple Network Management Protocol, SNMP). На самом деле SNMP - это не просто протокол, а целая технология, призванная обеспечить управление и контроль за устройствами и приложениями в сети. С ее помощью можно контролировать абсолютно любые устройства, подключенные к компьютерной сети, например датчики пожаротушения или даже светофоры. Разумеется, SNMP можно использовать (и это активно делают) для управления сетевыми компонентами: концентраторами, серверами, маршрутизаторами и т. п. Пользуясь информацией SNMP (такой, как показатель числа пакетов в секунду и коэффициент сетевых ошибок), сетевые администраторы могут более просто управлять производительностью сети и обнаруживать и решать сетевые проблемы.


Три составляющие части технологии SNMP: структура управляющей информации (Structure of Management Information, SMI) базы управляющей информации (Management Information Base, MIB) сам протокол SNMP

Модель управления SNMP:

Агентами в SNMP являются программные модули, которые работают в управляемых устройствах. Агенты собирают информацию об управляемых устройствах, в которых они работают, и делают эту информацию доступной для систем управления сетями (network management systems - NMS) с помощью протокола SNMP.
Протокол SNMP v1

SNMP реализован в 1988 практически во всех широко распространенных сетевых средах: TCP/IP, IPX/SPX, AppleTalk и др. Основной концепцией протокола является то, что вся необходимая для управления устройством информация хранится на самом устройстве - будь то сервер, модем или маршрутизатор - в так называемой Административной Базе Данных ( MIB - Management Information Base ). SNMP как непосредственно сетевой протокол предоставляет только набор команд для работы с переменными MIB. Этот набор включает следующие операции:
get-request Используется для запроса одного или более параметров MIB
get-next-request Используется для последовательного чтения значений. Обычно используется для чтения значений из таблиц. После запроса первой строки при помощи get-request get-next-request используют для чтения оставшихся строк таблицы
set-request Используется для установки значения одной или более переменных MIB
get-response Возвращает ответ на запрос get-request, get-next-request или set-request
trap Уведомительное сообщение о событиях типа cold или warm restart или "падении" некоторого link'а.


Для того, чтобы проконтролировать работу некоторого устройства сети, необходимо просто получить доступ к его MIB, которая постоянно обновляется самим устройством, и проанализировать значения некоторых переменных.

Формат сообщений

Сообщения SNMP состоят из 2 частей: имени сообщества (community name) и данных (data). Имя сообщества назначает среду доступа для набора NMS, которые используют это имя. Информационная часть сообщения содержит специфичную операцию SNMP (get, set, и т.д.) и связанные с ней операнды. Операнды обозначают реализации об'екта, которые включены в данную транзакцию SNMP.

Structure of Managment Information. RFC 1208

Определяет логику адресации информации при взаимодействии агентов и менеджеров SNMP. Синтиксис описывается абстрактными правилами Abstract Syntax Notation One, ASN.1.
Managment Information Base (MIB, MIB-II). RFC 1213

MIB представляет из себя набор переменных, характеризующих состояние объекта управления. Эти переменные могут отражать такие параметры, как количество пакетов, обработанных устройством, состояние его интерфейсов, время функционирования устройства и т.п. Каждый производитель сетевого оборудования, помимо стандартных переменных, включает в MIB какие-либо параметры, специфичные для данного устройства (в поддерево private enterprise).

Как происходит адресация в MIB к некоторой ее переменной?

По своей структуре MIB представляет из себя дерево.Каждому элементу соответствует численный и символьный идентификатор. В имя переменной включается полный путь до нее от корневого элемента root.

Например, время работы устройства с момента перезагрузки хранится в переменной, находящейся в разделе system под номером 3 и называется sysUpTime. Соответственно, имя переменной будет включать весь путь: iso(1).org(3).dod(6).internet(1).mgmt(2).mib-2(1).system(1).sysUpTime(3); или на языке чисел: 1.3.6.1.2.1.1.3. Следует заметить, что при этом узлы дерева разделяются точками.

Существует стандартная ветвь MIB, относящаяся к разделу управления mgmt, которую обычно поддерживают все сетевые устройства.
Тестирование сети с помощью SNMP

При помощи SNMP можно выполнять различные тесты функциональных возможностей сетевых устройств, определенные опять же на самих устройствах. Это бывает полезно, поскольку просто наблюдение статистики зачастую не дает полной картины происходящего.

Так, например, для раздела, относящегося к интерфейсам Ethernet, определен тест TDR (Time-domain reflectometry), позволяющий определять приблизительное расстояние до повреждения в коаксиальном кабеле. Для того, чтобы запустить TDR тест необходимо установить значение переменной ifExtnsTestTypе (1.3.6.1.2.1.12.2.1.4), содержащей тип выполняемого теста, так, чтобы она содержала идентификатор теста TDR в MIB: 1.3.6.1.2.1.10.7.6.1.

Результатом теста будет, во-первых, значение переменной ifExtnsTestResult (1.3.6.1.2.1.12.2.1.5), характеризующей исход теста:

1.отсутствие результата
2.успех
3.выполняется
4.не поддерживается
5.невозможно запустить
6.прекращен
7.неудачное завершение

И во-вторых, значение переменной ifExtnsTestCode (1.3.6.1.2.1.12.2.1.6) будет содержать идентификатор переменной MIB, содержащей результат теста. Результат теста определен как временной интервал в 100-наносекундных единицах между началом передачи тестового пакета и обнаружением коллизий в несущей. В принципе, на основании данного значения можно определить требуемое расстояние.
SNMP v2

Фундаментальным новшеством в SNMPv2 является то, что элемент администрирования сети может работать в качестве менеджера, агента или менеджера и агента одновременно. Данная концепция дает возможность пользователям применять SNMP в иерархической структуре, в которой локальные менеджеры отчитываются перед менеджерами среднего звена, которые, в свою очередь, контролируются менеджером высшего уровня. Немало места отводится проблемам защищенности SNMP, пожалуй, самой уязвимой точки протокола.

Безопасность SNMP. RFC 1352.

Один из наиболее заметных недостатков SNMP v1 - отсутствие развитой системы защиты данных на уровне, необходимом для сетей масштаба предприятия.

Как сказал Mike Warfield: "SNMP stands for Security Not My Problem".

В SNMPv1 защита административной информации трактовалась слишком упрощенно: она базировалась на использовании коллективного имени (Community Name), которое, находясь в заголовке SNMP, несло в себе все возможности защиты сообщений. Данное средство (известное под названием тривиальный протокол) требовало, чтобы программа-агент и менеджер опознали одно и то же коллективное имя, прежде чем продолжить выполнение операций сетевого администрирования. В результате многие администраторы сетей ограничивались в своей работе только функциями мониторинга, запрещая выдачу команды SET, способной изменять параметры конфигурации удаленного устройства. Это привело к тому, что пользователи избегали команд SET: такое примитивное средство защиты, как коллективное имя, могло дать возможность лицам, не наделенным соответствующими полномочиями, изменять параметры, о чем пользователи могли даже и не узнать. К тому же вся критически важная информация передавалась в открытом виде,поэтому в интернете доступен даже snmp sniffer

В связи с этим были разработаны предложения по совершенствованию защиты в рамках SNMPv1, представленные в июле 1992 г.; они составили основу структуры защиты для SNMPv2.

Стандартами защиты SNMPv2 определяются методы аутентификации (DAP - Digest Authentication Protocol) и обеспечения конфиденциальности (SPP -Symmetric Privacy Protocol) информации административного характера. В основе лежит концепция участника (party) - уникального набора параметров защиты, который может включать местоположение сети, протоколы аутентификации и обеспечения конфиденциальности, используемые между агентом и менеджером.

Проблемы внедрения SNMPv2

SNMPv2 сулит выгоды в плане защиты и производительности, что немаловажно для пользователей. Но некоторые компании наверняка предложат свои собственные идеи, особенно в части защиты и связей между менеджерами. Кроме того, фирмы, расширившие функциональные возможности своих баз данных MIB в средах с SNMPv1, вряд ли будут спешить с выпуском продуктов под SNMPv2.

Несомненно,пользователи захотят иметь продукты на базе SNMPv2. Но дело в том, что многие уже вложили слишком большие средства в версию SNMPv1, чтобы просто выбросить ее и начать все с нуля. Авторы SNMPv2 предвидели это и исходили из постепенности перехода на новую технологию. Предусмотрены два способа сохранения SNMPv1: использование уполномоченных агентов и двуязычных менеджеров. Уполномоченный агент выполняет преобразование форматов SNMPv1 в сообщения SNMPv2 и обратно.

Другой вариант - двуязычный менеджер, который одновременно поддерживает оба протокола (SNMPv1 и SNMPv2) и не требует преобразований. Двуязычный менеджер SNMP определяет, с каким форматом работает агент - версии 1 или версии 2, и общается на соответствующем диалекте. Таким образом, выбор версии протокола должен быть прозрачен для принимающих устройств.

К сожалению,вторая версия SNMP так до сих пор и не утверждена, поэтому в стане сетевого управления наблюдается разброд и шатания.
Доступные реализации агентов и менеджеров.

http://www.microsoft.com/smsmgmt/
MS SMS Netmon

http://www.winfiles.com/apps/98/net-manage.html
куча разнообразных агентов и менеджеров для Win95.
Небольшой, но приятный SNMP manager либо отсюда

Epilogue предлагает ПО, реализующее поддержку SNMP, включающую:

Envoy, Epilogue's compact, fast, portable SNMP solution for OEMs
Emissary, an SNMP MIB compiler that allows SNMP implementors to extend standard SNMP variables to support extensions to the MIBs in each managed device;
Ambassador, a complete, portable implementation of the RMON (FastEthernet) remote monitoring agent.


The IBM Netview for AIX feature of SystemView provides distributed or centralized management of large heterogeneous networks.

ACE*COMM WinSNMP supports SNMPv1 & SNMPv2u in v2.0 of its industry-leading Win16 and Win32 WinSNMP implementations.

Digital Unix POLYCENTER Manager on NetView provides client/server management of multivendor enterprise networks.

The PowerFlag tool - агент для UPS MIB источников бесперебойного питания компании Victron B.V.

WS_Ping ProPack v.2.10 позволяет просматривать MIB таблицы, указывать поддеревья. Для скачавания свежих версий с сервера Ipswitch можно использовать следующие данные :
User Name: 0000037181
Password: CQWSC
Serial Number: WP-101333


Openly-Available Implementations

CMU SNMP agent (source)

an agent that support both SNMPv1 and SNMPv2u
a number command line based applications that support both SNMPv1 and SNMPv2u.
Carnegie-Mellon University SNMP Development Kit supporting SNMPv1/v2

NetSCARF is a Network Statistics Collection and Reporting Facility. It allows ISPs to collect and report data about their part of the Internet, supports both SNMP version 1 and USEC.

Scotty is a network management extension for the Tool Command Language (Tcl) which includes a portable implementation of the SNMPv1, SNMPv2c and SNMPv2u protocol. The Scotty Tcl extension includes the network management platform (Tkined) which provides a MIB browser, a network map editor as well as status monitoring, troubleshooting, network discovery and event filtering scripts.

snmptcp v1.3 is a extensible platform for management applications which seemlessly implements SNMPv1, SNMPv2c, and SNMPv2u.
The package runs under the X Window System on UNIX and is built from Tool Command Language (Tcl7.3/Tk3.6).In addition to a MIB compiler, the package contains some minimal applications for a number of standard MIB modules.

Атака на Windows SNMP.

Cервисы работают на следующих UDP портах (/etc/services)
snmp 161/udp snmp
snmp-trap 162/udp snmp
Интересные SMI Network Management Private Enterprise Codes:
Prefix: 1.3.6.1.4.1.
2 IBM
4 Unix
9 cisco
32 Santa Cruz Operation
42 Sun Microsystems
Небольшое распространение сканнеров UDP портов под Windows, SNMP менеджеров, а также отсутствие знаний о самом протоколе является, по всей видимости, единственной причиной малочисленности атак на устройства под управление SNMP v1, так как в реализациях этого протокола в некоторых операционные системы допущены серьезные ошибки. Подтверждения этому то и дело появляются в списках рассылки bugtraq
Уязвимость в стандартной конфиругации Windows NT SNMP Сервиса.

Позволяет удаленно конфигурировать сетевые парамерты, которые влияют на безопасность и правильное функционирования системы (если администратор сам запустил SNMP Service)

При конфигурации по умолчанию, SNMP service отвечает на стандартное community ( имя ) "public", которое обладает права на чтение и запись. Community - это имя, которое обладает такими же функциями, как логин и пароль в системах.
Протокол SNMP предоставляет два уровня полномочий : read-only and read-write, однако до выхода SP4 Windows NT SNMP Service не позволял конфигурировать communities по доступу, отличному от read-write!
Если попытать обезопасить SNMP Service путем переименования community для доступа, то система останется незащищенной от крякера, имеющего аккаунт на машине, так как параметры SNMP Service находятся в регистри и доступны всем пользователям на чтение. Также Windows NT SNMP Service обладает возможностью ограничить доступ для списков IP-адресов. На первый взгляд это позволяет защититься от атак неизвестных систем, однако это не является проблемой для крякеров (что необходимо понимать любому администратору), так как протокол SNMP использует UDP протокол для обмена информацией, а он является протоколом без установления соединения, поэтому возможна подмена исходящего адреса (но для этого придется переработать исходники SNMP менеджеров под Unix и изучить UDP spoofing)
SNMP "set" операции ( позволяющие менять значение переменных ) могут быть произведены с подменой обратного адреса на любой, так как ответ не нужен. Однако если включено ограничение доверенных IP адресов, но придется найти аккаунт на атакуемой системе и извлечь доверенную информацию из регистри.

Благодаря сконфигурированному по умолчанию Windows NT SNMP Сервису мы можем извлечь с помощью SNMP менеджера следующую информацию :
- the LAN Manager domain name
- a list of users
- a list of shares
- a list of running services
Как рекомендовалось в ISS scanner'е, можно выключить эту порцию SNMP mibs
таким способом:
Открыть
HKLM\System\CurrentControlSet\Services\SNMP\Parameters\ExtensionAgents
найти значение, которое содержить
SOFTWARE\Microsoft\LANManagerMIB2Agent\CurrentVersion
и удалить его.
- a list of active TCP connections
- a list of active UDP connections
- a list of network interfaces and their associated IP and
hardware addresses
- the IP routing table and the ARP table as well as a number of
networking performance statistics.

Устанавливая переменные, крякер может модифицировать таблицу роуминга, ARP таблицу, выключить сетевые интерфейсы, сбить существенные сетевые параметры типа default IP, время жизни пакетов (TTL), IP forwarding (позволит крякеру перенаправлять сетевой трафик). Это особенно опасно, если атакуемая машина является фаерволом.

За примерами далеко ходить не надо, например, если машина является domain controller или server, но получить список всех пользователей в домене можно командой C:\NTRESKIT>snmputil walk public .1.3.6.1.4.1.77.1.2.25

Если вам хочется удалить все записи в базе данных WINS ( что приведет к полному отказу WinNT ), то для этого необходимо выполнить
~$snmpset -v 1192.178.16.2 public .1.3.6.1.4.1.311.1.2.5.3.0 a 192.178.16.2 из набора CMU SNMP development kit under Unix.

Также есть очень любопытная деталь при установки SNMP community names в Windows NT 4.0 (SP3). Если сервис включен, а имена не сконфигурированы, то любое имя будет давать read/write привилегии. Как оказалось, это указано еще в спецификации SNMP ( RFC 1157 )!
Четвертый СервисПак(SP4) предоставляет следующее решение проблемы: добавление контроля доступа community как READ ONLY,READ WRITE или READE CREATE. Однако по умолчанию SP4 устанавливает READ CREATE доступ, который все еще позволяет атаковать машины. Микрософт явно заботиться об удобстве WinNT для хакеров :)
Лучший способ защиты по рекомендации M$: заблокировать SNMP access на firewall'е.
Проблема в OS Solaris версии до 2.6.

Исходя из ISS Security Advisory (November 2nd, 1998), в агенте SNMP, который по умолчанию запущен в этой системе, существуют реальные угрозы получить доступ на уровне рута, манипулировать процессами и параметрами машины.
Для доступа к MIB-информации существует скрытая "undocumented community string", которая позволит атакующему изменить большинство системных параметров.

К сожалению, само это community не называется, однако ISS Internet Scanner и ISS RealSecure real-time intrusion detection могут детектировать эту проблемы, т.е. посмотреть можно и в их исходниках.



SSH [Secure Shell]

Interent в нашей стране становится все распространеннее. Но вместе с тем становятся все реальнее угрозы безопасности, в том числе, и со стороны хакеров, а точнее говоря, кракеров ' как доморощенных, так и зарубежных. Одновременно расширяется применение Unix-систем: ее повсеместно используют как Internet-провайдеры, так и потребители и поставщики ресурсов Сети.

Банковские и некоторые другие виды транзакций в корпоративных сетях предъявляют особые требования к системе безопасности. Появляются и новые Internet-приложения, требующие повышенных мер безопасности, в частности, электронная коммерция. Все это означает повышенное внимание к средствам обеспечения компьютерной безопасности в ОС Unix.

В настоящей статье рассматривается ssh (secure shell), одно из самых распространенных программных средств повышения компьютерной безопасности при работе Unix-систем в Internet.

Число как средств защиты, так и инструментов, способствующих взлому, в Internet огромно. Однако складывается впечатление, что по крайней мере два средства tcpwrapper и ssh входят в состав своеобразного джентльменского набора ОС Unix, который можно рекомендовать любому системному администратору. В частности, эти средства используют все отечественные Internet-провайдеры, с которыми мне приходилось иметь дело. Возможно, это связано и со стандартной_ комплектацией ssh операционной системы FreeBSD, весьма популярной среди наших провайдеров.

Причиной нашего внимания к этой теме является не только популярность ssh среди пользователей, работающих в самых разных областях. Хотя ssh появился лишь в 1995 г., в настоящее время он уже рассматривается как проект стандарта Internet, подготовкой которого занимается специальная рабочая группа secsh в IETF Security Area. Строго говоря, в этой рабочей группе стандартизуется, конечно, не ssh как программный продукт, а набор протоколов ssh.

Тем временем, ssh уже завоевал статус фактического стандарта Internet на безопасные терминальные соединения. Автором первоначального варианта ssh является Т. Ялонен. В настоящее время выпущена вторая версия ssh; разработкой программного продукта SSH2 занимается компания SSH Communication Security Кроме версии ssh, доступной бесплатно, имеется и усовершенствованный коммерчески доступный вариант. Кроме того, с использованием этой программы разработаны и некоторые другие коммерческие продукты. Поставками коммерческой версии ssh занимается Data Fellows; эта компания предлагает, в частности, программные продукты F-secure SSH Server и F-Secure SSH Tunell & Terminal.

Под ssh понимают как собственно программу, так и задействованный в ней протокол. Что касается программы, то для ее краткой характеристики следует сказать, что ssh представляет собой средство организации безопасного доступа к компьютерам при работе по небезопасным каналам связи. Для организации безопасного доступа применяется процедура аутентификации с использованием асимметричного шифрования с открытым ключом. Это обеспечивает более высокую безопасность, чем при использовании симметричного шифрования, хотя и порождает дополнительную вычислительную нагрузку. При последующем обмене данными применяется уже симметричное шифрование, более экономичное в смысле затрат процессорного времени.

Что касается типов обеспечиваемого удаленного доступа, ssh поддерживает возможности работы с telnet; безопасную работу с протоколом X11 благодаря возможности перенаправления соответствующих данных по надежным ssh-каналам; безопасную замену многим r_-командам Unix (rsh, rlogin и т.д.), с которыми, как известно, традиционно связаны проблемы обеспечения безопасности.

Впрочем, рассмотрение ssh следует начать с протоколов. Для того чтобы чтение статьи оказалось полезным для потребителей ssh_ и в первую очередь для системных администраторов, ранее не пользовавшихся средствами, подобными ssh, рассмотрение будет ориентировано на практически важные аспекты.

Протокол ssh

Проект стандарта ssh описывает протоколы ssh и состоит из нескольких документов, которые описывают общую архитектуру протокола, а также протоколы трех уровней: протокол транспортного уровня, протокол аутентификации и протокол соединения. Их задача _ обеспечивать безопасную сетевую службу наподобие удаленного login поверх небезопасной_ сети.
Протокол транспортного уровня обеспечивает аутентификацию сервера, конфиденцальность и целостность. Протокол аутентификации обеспечивает аутентификацию клиента для сервера. Наконец, протокол соединения ssh мультиплексирует безопасный (шифруемый) канал, представляя его в виде нескольких логических каналов, которые используются для различных целей (различных видов служб).

Протокол транспортного уровня предусматривает возможность сжатия данных. Этот протокол работает поверх соединения TCP/IP. Протокол аутентификации работает поверх протокола транспортного уровня, а протокол соединения ' поверх протокола аутентификации.

С целью повышения безопасности осуществляется не только аутентификация клиента для сервера, к которому обращается клиент, но и аутентификация сервера клиентом _ другими словами, происходит аутентификация обеих сторон.

Клиент шлет запрос на обслуживание в первый раз, когда устанавливается безопасное соединение транспортного уровня ssh. Второй запрос направляется уже после завершения аутентификации пользователя (клиента).

Прежде чем анализировать протоколы ssh подробнее, следует определить понятие ключ хоста_. Каждый работающий с ssh хост, на котором может выполняться как клиент, так и сервер, может иметь не менее одного ключа, причем для шифрования допускаются различные криптографические алгоритмы. Несколько хостов могут иметь общий ключ хоста. Однако каждый хост должен иметь хотя бы один ключ, с которым работает каждый из требуемых алгоритмов работы с открытыми ключами. В проекте стандарта в настоящее время требуемый алгоритм только один _ DSS (Digital Signature Standard).

Ключ хоста-сервера используется при обмене открытыми ключами с целью проверки того, что клиент действительно общается с настоящим_ (а не подмененным) сервером. Для этого клиент должен знать открытый ключ хоста-сервера. Это знание реализуется в рамках одной из двух моделей.

В первой клиент просто имеет некий локальный файл, в котором каждому имени хоста ставится в соответствие его открытый ключ. Во второй модели вводится понятие сертификационного агента_, который и отвечает за проверку соответствия имени хоста его открытому ключу. При этом клиент знает только открытый ключ самого сертификационного агента. В последнем случае упрощается поддержка клиента (ему нужно знать всего один открытый ключ), но появляются высокие требования к сертификационному агенту, который должен иметь открытые ключи всех хостов, к которым обращаются клиенты.

Протоколом предусмотрена возможность отказа от проверки ключа хоста-сервера при самом первом обращении клиента к этому серверу. При этом соединение клиент-сервер будет защищено от пассивного прослушивания сети, но возникает опасность атаки типа человек в середине_ (man-in-the-middle), т. е. попытки временной подмены сервера. Если эта возможность используется, ключ хоста-сервера будет автоматически передан клиенту и сохранен в его локальном файле.

Разработчики проекта протокола ssh особенно заботились о его долголетии_. Протокол будет расширяемым; планируется возможность дополнения криптографических алгоритмов, используемых при работе ssh. C этой целью проектом предусмотрено, что между клиентом и сервером происходят переговоры_, в результате которых выбираются методы шифрования, форматы открытых ключей и т.п., которые будут использованы в данном сеансе. При этом с целью обеспечения интероперабельности должен поддерживаться некоторый минимальный набор алть национальные криптографические стандарты.


Таблица 1. Номера сообщений ssh и их назначение

Интервал номеров Тип сообщений Протокол
1-19 Транспортный уровень (общая часть) Транспортный
20-29 Переговоры клиента и сервера о выборе алгоритма
30-49 Специфические для метода обмена ключами
50-59 Протокол аутентификации (общая часть) Аутентификации
60-79 Протокол аутентификации (часть, специфическая для метода аутентификации)
80-89 Протокол соединения (общая часть) Cоединения
90-127 Cообщения, относящиеся к каналам
90-128 Резерв (для протоколов клиентов)
192-255 Локальные расширения

Отдельного упоминания заслуживают вопросы увеличения трафика в связи с применением протоколов ssh. Ясно, что при передаче в сети больших пакетов дополнительная нагрузка, вызванная передачей управляющих заголовков ssh, невелика. Основное внимание следует обратить на приложения, для которых характерны короткие пакеты _ например, telnet. Минимальный размер заголовка TCP/IP равен 32 байта; минимальный же размер пакета при использовании ssh увеличится с 33 до (примерно) 51 байта.

Учитывая, что в Ethernet минимальная длина поля данных пакета равна 46 байт, дополнительный нагрузкой _ в 5 байт _ можно пренебречь. Наиболее существенным влияние ssh оказывается, вероятно, при использовании протокола PPP на низкоскоростных модемных соединениях, поскольку PPP сжимает заголовки TCP/IP. Однако существенный прогресс в скоростях передачи данных позволяет рассчитывать, что дополнительные задержки будут измеряться несколько миллисекундами и останутся незаметны человеку.

Наконец, несколько слов о кодировании сетевых адресов. Поскольку DNS ' ненадежный протокол, в ssh он не используется. При адресации применяются IP-адреса, причем в проекте заложена поддержка IPv6.

Все сообщения (пакеты) ssh содержат номер сообщения _ число от 1 до 255. Этот диапазон разбит на подинтервалы, причем разным уровням протокола ssh отвечают разные диапазоны.

Установка

При установке всякого бесплатно распространяемого по Internet программного продукта ' и ssh здесь не исключение ' часто приходится сталкиваться с тем, что используемая Вами версия ОС Unix чуть-чуть_ отличается от того, чего ждали от нее разработчики данного продукта. В результате программный продукт может оказаться не вполне работоспособен, или вовсе транслироваться с ошибками. Автор столкнулся с некоторыми особенностями установки ssh в средах SGI Irix и Linux; о них будет рассказано ниже. Формально наше изложение относится к ssh версии 1.2.26, если явно не оговорено противное (процедуры установки различных версий ничем кардинальным не отличаются).
После того, как дистрибутив ssh получен и разархивирован, процедура установки включает три простых стадии. На первой следует выполнить командный файл configure. Все основные особенности создаваемого варианта ssh задаются параметрами, указываемыми при запуске configure. Можно задать целый ряд ключей (операндов).

В частности, указывается, какие методы шифрования сеанса будут использованы при работе ssh (предлагается, в частности, IDEA, DES, тройной_ DES, ARCFOUR, BLOWFISH). Поскольку в ARCFOUR найдена дыра_, по умолчанию этот метод исключается, а остальные, наоборот, включены. Основным по умолчанию является IDEA, использующий 128-разрядные ключи. Если он исключен, основным алгоритмом становится 3DES, трехкратное последовательное DES-шифрование c 56-разрядным ключом. Учитывая несколько нашумевших вскрытий_ однократного DES-ключа, это выглядит разумной предосторожностью. Нужно отметить также метод BLOWFISH, который при той же длине ключа (от 32 до 448 разрядов) работает быстрее IDEA и DES. Используемый по умолчанию метод шифрования можно указать явно, установив нужное значение SSH_FALL BACK_CIPHER во включаемом файле ssh.h.

При запуске configure можно специфицировать поддержку Kerberos 5, cредств работы с сервером аутентификации TIS, с Secure Dynamics Secure ID card и т.д. Можно разрешить или запретить перенаправление портов TCP/IP клиентского и серверного хостов, а также ' отдельно _ перенаправление портов протокола X11.

Можно задать также замену стандартных команд rlogin и rsh соответствующими одноименными модулями из дистрибутива ssh. Тогда для соединений будет использоваться протокол ssh ' конечно, если удаленный компьютер его поддерживает (в противном случае после предупреждения будет осуществлен переход к обычным средствам rlogin/rsh).

Поскольку подразумеваемые значения ключей configure установлены весьма разумно, при вызове configure обычно не приходится задавать большого числа операндов и можно обойтись чем-то наподобие

./configure 'verbose

'with-libwrap=ПУТЬ 'with-X

где ПУТЬ задает путь к библиотеке libwarp.a, которая требуется при использовании tcp_wrapper (в этом случае кроме libwrap.a для установки ssh понадобится также файл tcp.h). Последний операнд указывает на работу с протоколом X11.

При работе configure используется Autoconf, известная программа с лицензией GNU, которая автоматически определяет массу характеристик установленного на локальном компьютере программного обеспечения. При наличии операнда verbose выполнение configure сопровождается выдачей информационных сообщений, позволяющих проконтролировать генерируемые параметры.

В результате выполнения сonfigure создает ряд новых файлов и каталогов, но главное для понимания процесса установки _ то, что при этом из файла-заготовки Makefile.in создается собственно Makefile.

На второй стадии установки запуск make приводит к компиляции всех основных модулей ssh. Наконец, третья стадия установки запускается по команде make install. При этом происходит запись порожденных программ в целевые_ каталоги (по умолчанию /usr/local/bin, /usr/local/sbin, /usr/local/man), а также создание нескольких файлов в каталоге /etc: ssh_config, sshd_config и ssh_host_key_pub.

В случае неудачи команда make distclean должна удалить все следы проделанного эксперимента_, кроме самого дистрибутива. Так написано в документации; на самом деле: в /usr/local/sbin и /usr/local/bin все остается.

В реальной жизни, конечно, возникают проблемы. Приведем некоторые конкретные примеры. Так, с ОС Irix не рекомендуется использовать версии ssh от 1.2.21 и более ранние из-за большого числа ошибок; желательно применять версии 1.2.25 и выше.

Поскольку применение ssh может вызвать задержки из-за загрузки процессора операциями шифрования, ssh желательно компилировать с оптимизацией. configure, кстати, имеет специальный операнд, разрешающий оптимизацию на уровне ассемблера. В качестве иллюстрации укажем, что для рабочей станции SGI O2 c микропроцессором R5000SC и ОС Irix 6.3, включение оптимизации Си-компилятора дает прирост производительности примерно на 25%. Однако есть сообщения, что такая оптимизация иногда вызывает ошибки при перенаправлении портов X11.


Таблица 2. Некоторые поддерживаемые ssh
операционные системы

ОС ssh 1.2.26 ssh 2.0.9
SGI Irix 5.2, 5.3, 6.0.1, 6.2-6.4 6.2, 6.4
Digital Unix 4.0, 4.0a, 4.0b, OSF/1: 3.0-3.2 4.0
Sun Solaris 2.3-2.6, SunOS 4.1 Solaris 2.5.1, 2.6
HP-UX 9.x, 10.x 10.20
IBM AIX 4.1, 4.2 4.1, 4.2
Linux Slackware 3.x, RedHat 5.1 2.0.34
FreeBSD 1.x, 2.x, 3.0 2.x, 3.0


В ssh 2.0.8 при трансляции в ОС Irix рекомендуется использовать Си-компилятор версии 7.2, поскольку он позволяет создать более производительную программу по сравнению с 7.1. Однако следует использовать cc 7.2.1, поскольку исходный_ Си-компилятор версии 7.2 дает неработоспособный ssh.

В качестве еще одной иллюстрации обсудим Linux. Для компиляции ssh не годится gcc популярной версии 2.7.2: нужна версия 2.7.2.3 или новее. В RedHat Linux для работы с аутентификацией RSA домашний каталог пользователя и его подкаталог .ssh не должны иметь разрешение на запись членами группы.

Файлы ssh

Обратимся сначала к образующимся после установки исполняемым файлам. Основных файлов два: cобственно демон sshd в /usr/local/sbin и клиент ssh в /usr/local/bin. В последнем каталоге располагается также модуль scp (ssh-аналог rcp) и ряд модулей с префиксом ssh_, среди которых отметим модули ssh_agent (аутентификационный агент, хранящий RSA-ключи аутентификации) и ssh_add, служащий для регистрации новых ключей в этом агенте. Кроме того, в /usr/local/bin имеется две важных вспомогательных утилиты: ssh-keygen и make-ssh-known-hosts.
Неисполняемые файлы ssh (кроме справочных файлов, помещаемых в /usr/local/man) располагаются в каталогe /etc и в домашних каталогах пользователей. В каталоге /etc расположены конфигурационные файлы sshd_config и ssh_config, задающие конфигурационные параметры соответственно sshd и ssh; эти файлы образуются автоматически по завершению установки.

В каталог /etc помещается информация о ключах. В файле ssh_host_key задается ключ хоста-сервеssh_host_key_pub) помещается в файл ssh_known_hosts. Естественно, его надо создавать самостоятельно.

В каталоге /etc образуется также рабочий файл ssh_random_seed, который автоматически модифицируется при запуске демона sshd. Наконец, в каталоге /etc могут располагаться еще два файла. Файл shosts.equiv является аналогом файла rhosts.equiv при работе с ssh. Файл sshrc выполняется при процедуре login перед вызовом оболочки.

Файлы, отражающие пользовательские настройки, располагаются в их домашних каталогах _ в подкаталоге .ssh. В этом подкаталоге располагается, в частности, RSA _ ключ пользователя (в файле identity) и соответствующий открытый ключ (в файле identity.pub). Кроме того, в каталоге .ssh может иметься коллекция открытых ключей удаленных_ пользователей (из их файлов identity.pub), находящаяся в файлe authorized.keys. Пользователь может создать также свой личный аналог файла /etc/ssh_known_hosts в файле known_hosts.

При первом вызове ssh (клиента) cоздается и автоматически корректируется при последующих вызовах файл random_seed. Собственные подразумеваемые параметры ssh можно задать в файле config. В файле rc можно указать действия, выполняемые при login до вызова пользовательской оболочки. Наконец, файл .shosts, аналог .rhosts при работе с ssh, располагается в домашнем каталоге пользователя.

Для генерации ключей заданной длины, как ключей хостов, так и ключей пользователей, применяется утилита ssh-keygen. Она автоматически вызывается в процессе установки для создания файлов, содержащих ключи хоста-сервера.

Типичный вызов ssh-keygen (квадратные скобки, как обычно, означают возможность опустить соответствующий операнд) выглядит так:

ssh-keygen [-b длина] [-N парольная_фраза] [-c комментарий]

позволяет создать файлы identity и identity.pub с RSA-ключами, длина которых задается операндом b. По умолчанию длина ключа равна 1024; она не должна быть меньше 512. Поле комментария по умолчанию генерируется в форме user@host. ПАРОЛЬНАЯ_ФРАЗА используется для шифрования личного ключа пользователя; ее рекомендуемая длина _ от 10 до 30 символов. При генерации ключа хоста ПАРОЛЬНАЯ_ФРАЗА должна отсутствовать; такой вызов автоматически происходит в процессе установки.

Утилита make-ssh-known-hosts представляет собой сценарий на языке Perl5 и служит для автоматизации создания файлов типа ssh_known_hosts. Если на компьютере Perl5 не установлен, подобные файлы придется создавать вручную.

Данная утилита обладает развитые средства взаимодействия с DNS-серверами и позволяет выполнять достаточно изощренный опрос этих серверов. Простейшая форма вызова имеет следующий вид:

make-ssh-known-hosts some.domain > /etc/ssh_known_hosts

Это позволяет найти и записать в файл ssh_known_hosts открытые ключи всех хостов домена some.domain. Утилита имеет, в частности, средства работы с WKS-записями DNS-сервера. Если в этих записях указан признак наличия ssh, то можно сразу отобрать только хосты, поддерживающие ssh. Аналогично можно отобрать хосты, поддерживающие telnet:

make-ssh-known-hosts some.domain Ё^wks=.*telnetё > our_hosts

Утилита может работать аналогичным образом с записями hinfo. Механизм ее работы следующий.

Получив от DNS-сервера список отобранных хостов, make-ssh-known-hosts пытается получить открытые ключи каждого из них. Для этого делается попытка соединиться на порт sshd (22 по умолчанию), и если соединение успешно, пытается выполнить на удаленном хосте команду cat /etc/ ssh_host_key.pub. Если это не удается, утилита проверяет, был ли получен ей в сеансе открытый ключ удаленного хоста; если да _ то он и используется (эту возможность можно отменить при вызове сценария).

Демон sshd

Запуск демона sshd обычно происходит автоматически при загрузке операционной системы из командного файла наподобие /etc/rc.local. Поскольку sshd должен сгенерировать ключ еще до установления соединения, что требует определенного времени, sshd не рекомендуют запускать через демон inetd. Однако, если процессор достаточно быстр, и длина ключа мала (меньше 512 разрядов), демон может периодически запускаться через inetd при каждой попытке соединиться на порт 22.
Напомним, что в целях безопасности не рекомендуют применять ключи короче 512 разрядов. При запуске sshd длину ключа можно указать в операнде -b (по умолчанию 768 разрядов). Подчеркнем, что здесь речь идет о ключе сервера (демона sshd), используемом в сеансе, а не о ключе хоста-сервера.

Запуск sshd с операндом -d включает режим отладки, что рекомендуется при проверке работоспособности, поскольку при этом выдается ряд информационных сообщений, позволяющих отслеживать происходящее. При нормальной эксплуатации этот режим следует отключить.

Параметры демон sshd читает из файла /etc/sshd_conf. В нем задаются, в частности, ссылки на файлы ssh_host_key и ssh_random_seed, длина ключа сервера, разрешенные методы шифрования, номер используемого sshd порта, уровень протоколирования работы sshd в системном журнале и др. Обычно этот файл является вполне подходящим, и необходимости его корректировать не возникает.

Клиент ssh

Клиент ssh cлужит в качестве замены командам rsh и rlogin. Типичная форма вызова ssh выглядит так:
ssh [-l имя_пользоваетля] ИМЯ_ХОСТА [команда]

Здесь ИМЯ_ПОЛЬЗОВАТЕЛЯ означает имя пользователя на удаленном хосте, с которым происходит соединение (задается операндом ИМЯ_ХОСТА). Операнд КОМАНДА, если он не опущен, указывает выполняемую на удаленном хосте команду.

Команда ssh имеет еще целый ряд операндов. В операнде -с можно указать метод шифрования (idea/blowfish/des/3des/arcfour); в операнде -p указывается номер порта. Операнд -v рекомендуется использовать для получения информации о том, что происходит в процессе установления сеанса, например, при возникновении каких-либо проблем, в первую очередь задержках в соединении.

Два операнда позволяют осуществлять перенаправление портов:

- L ПОРТ:ХОСТ:ПОРТХОСТА

позволяет перенаправить ПОРТ локального компьютера на ПОРТХОСТА удаленного компьютера, заданного в аргументе ХОСТ;

-R ПОРТ:ХОСТ:ПОРТХОСТА

осуществляет перенаправление ПОРТа на удаленном ХОСТе на порт локального хоста (последний аргумент).

Конфигурационные файлы клиента включают общий файл /etc/ssh_config и личные пользовательские config-файлы. Последние перекрывают_ действие общего файла, и их, в свою очередь, можно заменить явным заданием операндов ssh. В конфигурационном файле задаются такие параметры, как методы шифрования, возможность перенаправления портов, разрешение на использование обычных механизмов rsh/rlogin при невозможности ssh-аутентификации, номер используемого на удаленном сервере порта и др.

Отметим, что на локальном компьютере клиент ssh использует не порт 22, а выбранный случайно из диапазона непривилегированных портов.

Есть также возможность включить сжатие данных (можно указать, например, уровень сжатия, аналогичный gzip). Данный режим может оказаться актуален при работе по более медленным модемным соединениям.

В файле ssh_config могут задаваться специфические для определенных хостов параметры; общие для всех хостов установки даются в конце файла.

Для общей картины необходимо сказать несколько слов о процедуре взаимодействия клиента ssh и демона sshd. Имеется три основных типа ключей, с которыми имеет дело программа ssh: ключи хостов (локального компьютера и удаленного хоста-сервера), ключи пользователей и ключи сервера-демона sshd. Ключи аутентификации хоста и пользовательские ключи обычно имеют длину 1024 разряда, а ключ демона _ 768 разрядов.

Демон sshd во время своей работы пользуется собственным RSA-ключом, который не хранится ни в каких файлах, и изменяется через определенные интервалы времени (по умолчанию _ через 1 час). Это делает невозможным дешифрацию прослушанного_ сеанса через 1 час, есRSA клиентский компьютер до аутентификации через .rhosts/.shosts или hosts.equiv, что предотвращает подмены в DNS, маршрутизации или IP. (Естественно, все это относится к аутентификации по варианту 3 или выше).

Посмотрим, как это происходит. При запуске sshd генерирует cвой RSA-ключ. Клиент соединяется с sshd, который шлет клиенту открытые ключи _ свой собственный и хоста-сервера.

Клиент проверяет ключ хоста-сервера, и если эта аутентификация проходит, генерирует 256-разрядное случайное число, шифрует его с помощью ключей хоста-сервера и sshd, и пересылает серверу. Это случайное число затем используется обеими сторонами в качестве ключа сеанса, используемого во всех последующих передачах данных в этом сеансе.

Далее происходит аутентификационный диалог sshd и клиента. Клиент пытается добиться аутентификации самого себя (через .rhosts/.shosts, RSA-аутентификацию пользователя и т.п.), а после завершения аутентификации идет подготовка и запуск сеанса.

Остаток сеанса шифруется симметрично. Клиент выбирает алгоритм шифрования из числа тех, что предлагает ему sshd. Поэтому, в частности, ssh как программный продукт позволяет легко добавлять новые криптографические алгоритмы, например, национальные стандарты. Никаких паролей в чистом виде_ не передается, поскольку шифрование начинается до аутентификации.

Клиенты и серверы ssh разных версий успешно взаимодействуют друг с другом. Однако в случае большой разницы в возрасте_ (например, между версиями 1.2.13 и 1.2.26) некоторые возможности более новых версий работать не будут.

Отметим в заключение, что ssh-клиенты разработаны не только для Unix, но и для других операционных систем, в том числе для Windows (http:// www-acg.ncsa.uiuc.edu/ssh).

Заключение

В конце 1998 года появилась вторая версия ssh. Код в SSH2 полностью переписан, добавлены новые, более быстрые подпрограммы шифрования. Кроме того, в SSH2 появилось новое средство _ secure ftp, функциональность которого ясна из его названия. SSH2 cовместима с предыдущей версией. На момент подготовки статьи наиболее свежей была версия ssh 2.0.9.
В статье не ставилась попытка дать полное описание ssh, и многие вопросы вообще остались без рассмотрения(в частности, работа с X11). В то же время автор старался обратить внимание на основные (с его точки зрения) характеристики ssh и указать на потенциально существенные для системных администраторов особенности конкретных операционных систем, с которыми он сталкивался сам.



<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS