// ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ ΠΎΡΡ ΠΈ Π½Π΅ΠΊΡΠ°ΡΠΈΠ²ΠΎ
S := TSocket(Parameter);
// Π‘Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΠΎΠ±ΡΡΠΈΠ΅ SockEvents[0] Ρ FD_READ ΠΈ FD_CLOSE
WSAEventSelect(S, SockEvents[0], FD_READ or FD_CLOSE);
while True do
begin
case WSAWaitForMultipleEvents(3, @SockEvents[0], True, WSA_INFINITE, False) of
WSA_WAIT_EVENT_0: begin
WSAEnumNetworkEvents(S, SockEvents[0], NetworkEvents);
if NetworkEvents.lNetworkEvents and FD_READ > 0 then
if NetworkEvents.iErrorCode[FD_READ_BIT] = 0 then
begin
// ΠΡΠΈΡΠ»ΠΈ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ
end
else
begin
// ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°. ΠΡΠΆΠ½ΠΎ ΡΠΎΠΎΠ±ΡΠΈΡΡ ΠΎ Π½Π΅ΠΉ ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΡ Π½ΠΈΡΡ
closesocket(3);
Exit;
end;
if NetworkEvents.lNetworkEvents and FD_CLOSE > 0 then
begin
// Π‘Π²ΡΠ·Ρ ΡΠ°Π·ΠΎΡΠ²Π°Π½Π°
if NetworkEvents.iErrorCode[FD_CLOSE_BIT] = 0 then begin
// Π‘Π²ΡΠ·Ρ Π·Π°ΠΊΡΡΡΠ° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ
end
else
begin
// Π‘Π²ΡΠ·Ρ ΡΠ°Π·ΠΎΡΠ²Π°Π½Π° Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ±ΠΎΡ ΡΠ΅ΡΠΈ
end;
// Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΊΡΡΡΡ ΡΠΎΠΊΠ΅Ρ ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΡ Π½ΠΈΡΡ
closesocket(S);
Exit;
end;
end;
WSA_WAIT_EVENT_0 + 1: begin
// ΠΠΎΠ»ΡΡΠ΅Π½ ΡΠΈΠ³Π½Π°Π» ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅
// ΠΠ΄Π΅ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΊΠΎΠ΄ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
// ΠΠΎΡΠ»Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠ±ΡΠΎΡΠΈΡΡ Π²ΡΡΡΠ½ΡΡ
ResetEvent(SockEvents[1]);
end;
WSA_WAIT_EVENT_0 + 2: begin
// ΠΠΎΠ»ΡΡΠ΅Π½ ΡΠΈΠ³Π½Π°Π» ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ Π½ΠΈΡΠΈ
closesocket;
ResetEvents(SockEvents[2]);
Exit;
end
end;
end;
end;
ΠΠ°ΠΊ ΠΈ Π²ΠΎ Π²ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ , Π·Π΄Π΅ΡΡ Π΄Π»Ρ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΠΈ Π½Π΅ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ²ΡΠ·ΠΈ Ρ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ shutdown.
ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π° ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°. Π ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π½ΠΈΡΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΈΠΊΠ», ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· Π²ΡΠ·ΠΎΠ²Π° accept ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ Π½ΠΈΡΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠΎΠΊΠ΅ΡΠ°. ΠΠ°ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΈΠ΅ Π½ΠΈΡΠΈ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠ³ΡΡ Π΄Π°Π²Π°ΡΡ ΡΠ°ΠΊΠΈΠΌ Π½ΠΈΡΡΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ (Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΈΡΠΈ, ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠ΅ΠΉ ΡΠΎΠΊΠ΅Ρ, ΡΠ²ΠΎΡ ΠΊΠΎΠΏΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° SockEvents). ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ.
Π Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠ°ΠΌ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΠ½Π΅ΡΡΠΈ Π΅Π³ΠΎ Π½ΠΈΠ·ΠΊΡΡ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ ΠΏΡΠΎΡΠΈΠ² DoS-Π°ΡΠ°ΠΊ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ². ΠΡΠ»ΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π½ΠΈΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½ΠΈΡΠ΅ΠΉ ΠΎΡΠ΅Π½Ρ Π±ΡΡΡΡΠΎ ΡΡΠ°Π½Π΅Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΈΠΌ, ΠΈ Π²ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π΅ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΠΉ, Ρ.ΠΊ. Π±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π±ΡΠ΄Π΅Ρ ΡΡΠ°ΡΠΈΡΡΡΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΡΡΠΌΠΈ. ΠΠΎΠ»Π΅Π΅ Π·Π°ΡΠΈΡΠ΅Π½Π½ΡΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π°ΡΠΈΠ°Π½Ρ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ΅ΡΠ²Π΅Ρ Π·Π°ΡΠ°Π½Π΅Π΅ ΡΠΎΠ·Π΄Π°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ°Π·ΡΠΌΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½ΠΈΡΠ΅ΠΉ (ΠΏΡΠ» Π½ΠΈΡΠ΅ΠΉ) ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π·Π°ΠΏΡΠΎΡΠ° ΠΈΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΏΠΎΡΡΡΠ°Π΅Ρ Π»ΡΠ±ΠΎΠΉ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΈΡΠΈ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠ»Π°. ΠΡΠ»ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΈΡΠΈ Π² ΠΏΡΠ»Π΅ Π½Π΅Ρ, Π·Π°Π΄Π°Π½ΠΈΠ΅ ΡΡΠ°Π²ΠΈΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΠΎ ΠΌΠ΅ΡΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π½ΠΈΡΠ΅ΠΉ Π·Π°Π΄Π°Π½ΠΈΡ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡΡΡ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ. ΠΡΠΈ DoS-Π°ΡΠ°ΠΊΠ°Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΠΌΠΈ Π·Π°Π΄Π°Π½ΠΈΡΠΌΠΈ, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΊΡΠ°Ρ Ρ Π²ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠΎ ΡΠ΅ΡΠ²Π΅Ρ Ρ ΠΏΡΠ»ΠΎΠΌ Π½ΠΈΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ (ΠΎΠ±ΡΡΠ½ΠΎ β ΡΠ΅ΡΠ΅Π· ΠΏΠΎΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π·Π΄Π΅ΡΡ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌ). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅Ρ Π±Π΅Π· ΠΏΡΠ»Π° Π½ΠΈΡΠ΅ΠΉ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ, Π΅ΡΠ»ΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡ DoS-Π°ΡΠ°ΠΊ Π½ΠΈΠ·ΠΊΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΠΎΠ΄ΡΠ΅ΡΡΡ ).
ΠΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΠ° Π΄Π»Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ΅Π»Π΅ΡΠΎΠΎΠ±ΡΠ°Π·Π½Π΅Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ Π² ΡΡΠ½ΠΊΡΠΈΡ ProcessSockEvents Π½Π΅ Π³ΠΎΡΠΎΠ²ΡΠΉ ΡΠΎΠΊΠ΅Ρ, Π° ΡΠΎΠ»ΡΠΊΠΎ Π°Π΄ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ° ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ²ΡΠ·ΠΈ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ°ΠΌΠ° Π½ΠΈΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΡΠ°Π»ΠΎΠΌ ΡΠΈΠΊΠ»Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π΅Π½ Π΄Π»Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΎΠ΄Π½ΠΎΡΠΈΠΏΠ½ΡΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌΠΈ.
2.2.8. ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² Ρ ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ
Π Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Π°ΠΌ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ°, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΡ , ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΡΠΎ, ΡΡΠΎ Π½ΠΈΡΡ, ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠ°Ρ ΡΠΎΠΊΠ΅Ρ, ΠΌΠΎΠΆΠ΅Ρ Π²ΡΡ ΠΎΠ΄ΠΈΡΡ ΠΈΠ· ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠΌ, Π½ΠΎ ΠΈ ΠΏΠΎ ΠΈΠ½ΡΠΌ ΡΠΈΠ³Π½Π°Π»Π°ΠΌ. ΠΡΠΎΡΠΎΠΊΠΎΠ» ΠΎΠ±ΠΌΠ΅Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ, Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²ΠΎ Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌΠ΅. ΠΠΎΡΡΠΎΠΌΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ». Π€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΏΡΠ΅ΠΆΠ½ΠΈΠΌ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΡΡ ΡΡΠΈ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΡΠ»Π°Π½Ρ. Π’Π΅ΠΏΠ΅ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ°Π²ΠΎ ΠΏΠΎΡΡΠ»Π°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ, Π½Π΅ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΎΡΠ²Π΅ΡΠ° Π½Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ, Π° ΡΠ΅ΡΠ²Π΅Ρ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ°Π²ΠΎ ΠΏΠΎΡΡΠ»Π°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΡΠ²Π΅Ρ Π½Π° Π΅Π³ΠΎ Π·Π°ΠΏΡΠΎΡΡ, Π½ΠΎ ΠΈ ΠΏΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π΅. Π Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΡΠ»Π°ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΡΡΠΎΠΊΡ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ.
Π‘Π΅ΡΠ²Π΅Ρ Π½Π° Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ ΡΠΎΠ±ΡΡΠΈΡΡ (ΠΏΡΠΈΠΌΠ΅Ρ EventSelectServer Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅) ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅Π³ΠΎ Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΌ ΡΠ°Π½Π΅Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠ½ΠΈΡΠ΅Π²ΡΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ (ΠΏΡΠΈΠΌΠ΅Ρ MultithreadedServer, ΡΠΌ. ΡΠ°Π·Π΄. 2.1.12). Π Π½Π΅ΠΌ ΡΠ°ΠΊΠΆΠ΅ Π΅ΡΡΡ Π½ΠΈΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΈΡΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π° Π³Π»Π°Π²Π½Π°Ρ Π½ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΠΎΠΊΠ΅Ρ ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π΅Π³ΠΎ Π½ΠΈΡΡ.
ΠΡΠ΅ ΠΎΠ΄Π½ΠΈΠΌ Π²Π°ΠΆΠ½ΡΠΌ ΠΎΡΠ»ΠΈΡΠΈΠ΅ΠΌ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΎΡ Π²ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ΡΡΠ°Π½Π΅Ρ ΡΠΎ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠΌΠΎΠΆΠ΅Ρ Π΅Π³ΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ. ΠΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΈ ΠΊ ΡΠ°ΠΊΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌ, ΠΊΠ°ΠΊ SelectServer, NonBlockingServer ΠΈ AsyncSelectServer, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΈΡΠΈ. ΠΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½ΠΈΡΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠ½ΠΈΡΠ΅Π²ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ: ΡΠ½ΠΈΡΡΠΎΠΆΠΈΠ² ΡΠΎΠΊΠ΅ΡΡ ΠΈΠ· Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡΠΈ β Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Ρ ΡΡΠΈΠΌΠΈ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ Π½ΠΈΡΠΈ Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΈΡΡ Π±Ρ Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΡΠΎ ΠΏΠΎΡΠΎΡΠ½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ. Π Π΅ΠΆΠΈΠΌ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ Π½ΠΈΡΠΈ Π½Π° Π²Π½Π΅ΡΠ½ΠΈΠΉ ΡΠΈΠ³Π½Π°Π» ΠΎΠ± ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ. ΠΡΠΊΠ»ΡΡΠ°ΡΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ ΠΏΠΎ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 2.63 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ Π½ΠΈΡΠΈ, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡΠ΅ΠΉ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ (ΠΊΠΎΠ΄ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² LogMessage ΠΈ DoLogMessage ΠΎΠΏΡΡΠ΅Π½, Ρ.ΠΊ. ΠΎΠ½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅Π½ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π°Ρ 2.20 ΠΈ 2.7 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ).
ΠΠΈΡΡΠΈΠ½Π³ 2.63. ΠΠΈΡΡ, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡΠ°Ρ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈunit ClientThread;
{
ΠΠΈΡΡ, ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠ°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
ΠΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΈΠΊΠ», Π²ΡΡ ΠΎΠ΄ ΠΈΠ· ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΏΠΎ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΡΠΈΠ³Π½Π°Π»Ρ ΠΈΠ»ΠΈ ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π° ΡΠΎΠΊΠ΅ΡΠ΅. Π£ΠΌΠ΅Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΠΎ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΡΠΈΠ³Π½Π°Π»Ρ.
}
interface
uses
Windows, Classes, WinSock, Winsock2_Events, ShutdownConst, SysUtils, SyncObjs;
type
TClientThread = class(TThread)
private
// Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π»ΠΎΠ³,
// Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΠΎΠ»Π΅, Ρ.ΠΊ. ΠΌΠ΅ΡΠΎΠ΄, Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉΡΡ ΡΠ΅ΡΠ΅Π·
// Synchronize, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
FMessage: string;
// ΠΡΠ΅ΡΠΈΠΊΡ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π»ΠΎΠ³Π°, ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Π΄Π°Π½Π½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
FHeader: string;
// Π‘ΠΎΠΊΠ΅Ρ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
FSocket: TSocket;
// Π‘ΠΎΠ±ΡΡΠΈΡ Π½ΠΈΡΠΈ
// FEvents[0] ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½ΠΈΡΠΈ
// FEvents[1] ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
// FEvents[2] ΡΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Ρ ΡΠΎΠ±ΡΡΠΈΡΠΌΠΈ FD_READ, FD_WRITE ΠΈ FD_CLOSE
FEvents; array[0..2] of TWSAEvent;
// ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΠΊΡΠΈΡ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π±ΡΡΠ΅ΡΡ ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΡ
FSendBufSection: TCriticalSection;
// ΠΡΡΠ΅Ρ ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΡ
FSendBuf: string;
// ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΠ΅ΡΠ΅Π· Synchronize
procedure DoLogMessage;
// Π€ΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡΡΠ°Ρ, Π·Π°Π²Π΅ΡΡΠΈΠ»Π° Π»ΠΈ Π½ΠΈΡΡ ΡΠ°Π±ΠΎΡΡ
function GetFinished: Boolean;
protected
procedure Execute; override;
// ΠΡΠ²ΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² Π»ΠΎΠ³ Π³Π»Π°Π²Π½ΠΎΠΉ ΡΠΎΡΠΌΡ
procedure LogMessage(Ρonst Msg: string);
// ΠΡΠΏΡΠ°Π²ΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Π±ΡΡΠ΅ΡΠ° ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΡ
function DoSendBuf: Boolean;
public
constructor Create(ClientSocket: TSocket; const ClientAddr: TSockAddr);
destructor Destroy; override;
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Π² Π±ΡΡΠ΅Ρ ΠΈΡΡ ΠΎΠ΄ΡΡΠΈΡ
procedure SendString(const S: string);
// ΠΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π½ΠΈΡΠΈ ΠΈΠ·Π²Π½Π΅
procedure StopThread;
property Finished: Boolean read GetFinished;
end;
ESocketError = class(Exception);
implementation
uses
MainServerUnit;
{ TClientThread }
// Π‘ΠΎΠΊΠ΅Ρ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π² Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡΠΈ,
// Π° ΡΡΠ΄Π° ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°. ΠΠ»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ
// Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΡΡΠ΄Π° ΠΆΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π°Π΄ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
constructor TClientThread.Create(ClientSocket: TSocket; const ClientAddr: TSockAddr);