Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Delphi. Π’Ρ€ΡŽΠΊΠΈ ΠΈ эффСкты». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 47

Автор Π’Π°Π»Π΅Ρ€ΠΈΠΉ Борисок

end;

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ReleaseFileMapping, симмСтричная ΠΏΠΎ своСму Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ GetFileMapping, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 10.24.

...

Листинг 10.24.

ОсвобоТдСниС ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°

procedure ReleaseFileMapping();

begin

UnmapViewOfFile(hook_info);

hook_info := nil;

CloseHandle(hFile);

hFile := 0;

end;

Ѐункция GetFileMapping ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ReleaseFileMapping ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ hFile (Ρ‚ΠΈΠΏ THandle), ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½ΡƒΡŽ Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ HookData.

НаконСц ΠΏΡ€ΠΈΡˆΠ»Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ. Π•Π΅ рСализация ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 10.25.

...

Листинг 10.25.

Ѐункция-Π»ΠΎΠ²ΡƒΡˆΠΊΠ°

function WndProcHook(code: Integer; wparam: WPARAM;

lparam: LPARAM): LRESULT stdcall;

var

hook_data: ^TCWPStruct;

begin

//ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ доступ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°

if not GetFileMapping() then

begin

//НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π°. Π¦Π΅Π½ΠΎΠΉ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ

//сообщСний Π½Π΅ Π΄Π°Π΄ΠΈΠΌ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ошибкам доступа ΠΊ памяти

WndProcHook := 0;

Exit;

end;

if code < 0 then

begin

WndProcHook := CallNextHookEx(hook_info^.hook_handle, code,

wParam, lParam);

//Освободим ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΡŽ Ρ„Π°ΠΉΠ»Π°

ReleaseFileMapping();

Exit;

end;

//МоТно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСниС

hook_data := Pointer(lParam);

//ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сообщСния Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°

if hook_data^.hwnd = hook_info^.wnd then

begin

//ЗаполняСм поля структуры Π² ΠΎΠ±Ρ‰Π΅ΠΉ области памяти ΠΈ посылаСм

//сообщСниС ΠΎΠΊΠ½Ρƒ-ΡˆΠΏΠΈΠΎΠ½Ρƒ

hook_info^.mess := hook_data^.message;

hook_info^.wParam := hook_data^.wParam;

hook_info^.lParam := hook_data^.lParam;

PostMessage(hook_info^.spy_wnd, WM_SPY_NOTIFY, 0, 0);

end;

//ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ сообщСниС для дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

WndProcHook := CallNextHookEx(hook_info^.hook_handle, code,

wParam, lParam);

//Освободим ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΡŽ Ρ„Π°ΠΉΠ»Π°

ReleaseFileMapping();

end;

Код Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WndProc достаточно прост, поэтому Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π΅Π³ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ. Поясним лишь, для Ρ‡Π΅Π³ΠΎ всС-Ρ‚Π°ΠΊΠΈ GetFileMapping ΠΈ ReleaseFileMapping Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ сообщСния.

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° DLL Π² адрСсноС пространство Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ процСсса отличаСтся ΠΎΡ‚ ΡˆΡ‚Π°Ρ‚Π½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LoadLibrary: Π½Π΅ вызываСтся ΠΊΠΎΠ΄ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ hookinf ΠΎ ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π»Π° Π»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π° проСкция Ρ„Π°ΠΉΠ»Π°. Π’Π΅Π»ΠΈΠΊΠ° Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Π΅Π· отсутствия Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ hookinf ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π΅Π½ Π½ΡƒΠ»ΡŽ. Как Ρ‚ΠΎΠ³Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, связан Π»ΠΈ этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ памяти, ΠΊΡƒΠ΄Π° спроСцирован Ρ„Π°ΠΉΠ»?

МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, завСсти 64-Π±ΠΈΡ‚Π½ΡƒΡŽ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π»ΠΎΡΡŒ Π±Ρ‹ «магичСскоС» число ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ указатСля hookinf ΠΎ. Но Π² Ρ‚Π°ΠΊΠΎΠΌ случаС Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ носила Π±Ρ‹ вСроятностный Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€.

Π Π΅Ρ‡ΡŒ Π½Π΅ ΠΈΠ΄Π΅Ρ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π»ΠΎΠ²ΡƒΡˆΠΊΠ° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° самым ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, просто Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° cGetFileMapping HReleaseFileMapping ΠΏΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ показалась Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ простой ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π°ΡŽΡ‰Π΅ΠΉΡΡ объяснСнию.

Π“Π»Π°Π²Π° 11 Π‘Π΅Ρ‚Π΅Π²ΠΎΠ΅ взаимодСйствиС

β€’ ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС сСтСвых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

β€’ ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

β€’ Π‘Π»Π΅ΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ ΠΏΠΎ сСти

β€’ ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€Π½ΠΈΠΊ

ΠžΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ³ΠΎ сСтСвого взаимодСйствия ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ прилоТСния Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ являСтся Π·Π°Π΄Π°Ρ‡Π΅ΠΉ довольно слоТной Π΄Π°ΠΆΠ΅ для программиста со Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²Π΄Π°, Ссли ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ API сСтСвого взаимодСйствия, прСдоставляСмый ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой (Π² нашСм случаС – Windows). Однако с использованиСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Delphi, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ€ΡƒΡ‚ΠΈΠ½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ созданию соСдинСний, пСрСсылкС Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŽ ошибок ΠΈ Ρ‚. Π΄., ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ становится Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ простым, Π½ΠΎ ΠΈ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ занятиСм. Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрим нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² создания нСслоТных сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, построСнных с использованиСм Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Β«ΠΊΠ»ΠΈΠ΅Π½Ρ‚ – сСрвСр».

11.1. ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС сСтСвых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

Π’ Delphi 7 количСство ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² для программирования самых Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сСтСвых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ просто Ρ€Π°Π΄ΡƒΠ΅Ρ‚ Π³Π»Π°Π· (см. Π²ΠΊΠ»Π°Π΄ΠΊΠΈ IndyQients ΠΈ IndyServers). ΠœΡ‹ рассмотрим построСниС прилоТСния Π½Π° Π±Π°Π·Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ IdTCPServer ΠΈ IdTCPCLient (написаниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с использованиСм всСх сСтСвых ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ Π·Π°Π½ΡΡ‚ΡŒ всю ΠΊΠ½ΠΈΠ³Ρƒ).

Π˜Ρ‚Π°ΠΊ, сначала ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ сСрвСра IdTCPServer. Для использования возмоТностСй сСрвСра этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π΅ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ). ΠŸΡ€ΠΈ настройкС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ свойства:

β€’ Active – Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ»ΠΈ Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ сСрвСр (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ False);

β€’ Bindings – настраиваСт сСрвСрныС сокСты (присоСдиняСт ΠΈΡ… ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΏΠΎΡ€Ρ‚Ρƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, позволяСт Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ IP-адрСсов ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²) ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Binding Editor;

β€’ ListenQueue – числСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ максимальноС количСство запросов Π½Π° установлСниС соСдинСния ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ;

β€’ MaxConnections – позволяСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ максимальноС количСство ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², присоСдинСнных ΠΊ сСрвСру;

β€’ MaxConnectionReply – позволяСт Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ сообщСниС, посылаСмоС сСрвСром Π½ΠΎΠ²Ρ‹ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΈΡ… количСство достигаСт MaxConnections.

Рассмотрим нСсколько ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ настройку сСрвСрных Π³Π½Π΅Π·Π΄ с использованиСм свойства Bindings. Π’Π°ΠΊ, Π½Π° рис. 11.1 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Binding Editor Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ сСрвСр Π½Π° обслуТиваниС ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² с Π»ΡŽΠ±Ρ‹ΠΌΠΈ IP-адрСсами, ΠΏΡ€ΠΈ этом сСрвСрный сокСт присоСдиняСтся ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ 12340.

Рис. 11.1. ИспользованиС ΠΎΠΊΠ½Π° Binding Editor

Для Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ настройки ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сСрвСрного сокСта ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΊΠ½Π° Object TreeView ΠΈ Object Inspector Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 11.2.

Рис. 11.2. Настройка сСрвСрного Π³Π½Π΅Π·Π΄Π°

На этом настройку сСрвСра ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ (хотя здСсь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС возмоТности ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° IdTCPServer). Основная ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π° сСрвСра ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ запросов ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события OnExecute. Π’ этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ пСрСдаСтся ссылка Π½Π° o6beKTTIdPeerThread – ΠΏΠΎΡ‚ΠΎΠΊ, ассоциированный с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, присоСдинСнным ΠΊ сСрвСру. ΠŸΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, Π΅Π³ΠΎ свойства Connection) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ мноТСство ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² соСдинСния. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° TIdPeerThread ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ запроса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.1.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим, ΠΊΠ°ΠΊ ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ (IdTCPQient), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» способСн Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с нашим сСрвСром. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π’Π‘Π -ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, достаточно ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ).

ПослС этого ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΅Π³ΠΎ свойства (ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…):

β€’ Host – имя ΠΈΠ»ΠΈ IP-адрСс ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π·Π°ΠΏΡƒΡ‰Π΅Π½ сСрвСр;

β€’ Port – Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ присоСдинСн сСрвСрный сокСт.

Π’ΠΎΠΎΠ±Ρ‰Π΅, Π΄Π°ΠΆΠ΅ эти свойства Π½Π° этапС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ„ΠΎΡ€ΠΌΡ‹ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ получаСтся Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ, Ссли Π΄Π°Π²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ (ΠΈΠ»ΠΈ ввСсти) имя ΠΈΠ»ΠΈ адрСс сСрвСра.

11.2. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

Π’ Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с описанными Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ IdTCPServer ΠΈ IdTCPChent рассмотрим созданиС нСслоТного ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрного прилоТСния, клиСнтская ΠΈ сСрвСрная части ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

β€’ ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ соСдиняСтся с сСрвСром ΠΈ отправляСт Π΅ΠΌΡƒ Π²Π²Π΅Π΄Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ строку, ΠΆΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π°, Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ сСрвСра тСкст, отсоСдиняСтся ΠΎΡ‚ сСрвСра.

β€’ Π‘Π΅Ρ€Π²Π΅Ρ€Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ строку ΠΎΡ‚ клиСнтского прилоТСния ΠΈ посылаСт ΠΎΡ‚Π²Π΅Ρ‚ (Ρ‚Π°ΠΊΠΆΠ΅ тСкстовый), послС Ρ‡Π΅Π³ΠΎ Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС. Плюс ΠΊ этому вСдСтся подсчСт количСства обслуТСнных ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ запоминаСтся IP-адрСс ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΡˆΠ΅Π» послСдний запрос.

РСализация ΠΊΠ°ΠΊ сСрвСрного, Ρ‚Π°ΠΊ ΠΈ клиСнтского ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² нашСм случаС ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ проста. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ сСрвСрного прилоТСния Ha3biBaeTCflSimpleServer. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ Ρ„ΠΎΡ€ΠΌΡ‹ сСрвСра (Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния) прСдставлСн Π½Π° рис. 11.3.

Рис. 11.3. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ простого сСрвСра

ВСкстовоС ΠΏΠΎΠ»Π΅ (Edit) с количСством ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… запросов ΠΈΠΌΠ΅Π΅Ρ‚ имя txtCount, Π° тСкстовоС ΠΏΠΎΠ»Π΅ с адрСсом послСднСго обслуТСнного ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π½Π°Π·Π²Π°Π½ΠΎ txtFrom. Вся Ρ€Π°Π±ΠΎΡ‚Π° сСрвСра Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ события Execute для ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° IdTCPServer, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ (присоСдинитС этот ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΊ ΠΏΠΎΡ€Ρ‚Ρƒ 12340 ΠΈ установитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства Active = True) (листинг 11.1).

...

Листинг 11.1. РСализация простого сСрвСра

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);

var

strText: string;

begin

//ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° строку

strText := AThread.Connection.ReadLn;

//ΠžΡ‚Π²Π΅Ρ‡Π°Π΅ΠΌ

AThread.Connection.WriteLn(\'ΠŸΡ€ΠΈΠ½ΡΠ» строку:\' + strText);

//Обновим свСдСния Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ сСрвСра (сСрвСр ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ,

//поэтому ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ)

section.Enter;

Inc(processed,1);

txtCount.Text := IntToStr(processed);

txtFrom.Text := AThread.Connection.Socket.Binding.PeerIP;

section.Leave;

//Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ соСдинСниС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ

AThread.Connection.Disconnect;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

section := TCriticalSection.Create;

end;

ΠŸΡ€ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ сСрвСр Ρ‚ΠΎΠ»ΡŒΠΊΠΎ повторяСт ΠΏΡ€ΠΈΠ½ΡΡ‚ΡƒΡŽ ΠΎΡ‚ Π½Π΅Π³ΠΎ строку с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ тСкста ΠŸΡ€ΠΈΠ½ΡΠ»: Π² Π½Π°Ρ‡Π°Π»ΠΎ строки.

Анализируя листинг 11.1, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Π² рассматриваСмом ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ сСрвСрС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ внСшнСго Π²ΠΈΠ΄Π° Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ критичСской сСкции (Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ имя модуля SyncObjs Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ uses).