FEvents[1] := WSACreateEvent;
if FEvents[1] = WSA_INVALID_EVENT then
raise ESocketError.Create(
'ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°: ' + GetErrorString);
if WSAEventSelect(FServerSocket, FEvents[1], FD_ACCEPT) = SOCKET_ERROR then
raise ESocketError.Create(
'ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠΊΠ΅ΡΠ° ΠΊ ΡΠΎΠ±ΡΡΠΈΡ: ' + GetErrorString);
FClientThreads := TList.Create;
inherited Create(False);
end;
destructor TListenThread.Destroy;
begin
// Π£Π±ΠΈΡΠ°Π΅ΠΌ Π·Π° ΡΠΎΠ±ΠΎΠΉ
FClientThreads.Free;
WSACloseEvent(FEvents[0]);
WSACloseEvent(FEvents[1]);
inherited;
end;
procedure TListenThread.Execute;
var
// Π‘ΠΎΠΊΠ΅Ρ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π΄Π»Ρ ΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠΈΠΌΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
ClientSocket: TSocket;
// ΠΠ΄ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ClientAddr: TSockAddr;
ClientAddrLen: Integer;
NetEvents: TWSANetworkEvents;
I: Integer;
WaitRes: Cardinal;
begin
LogMessage('Π‘Π΅ΡΠ²Π΅Ρ Π½Π°ΡΠ°Π» ΡΠ°Π±ΠΎΡΡ');
// ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ»
repeat
// ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ Ρ 15-ΡΠ΅ΠΊΡΠ½Π΄Π½ΡΠΌ ΡΠ°ΠΉΠΌ-Π°ΡΡΠΎΠΌ
WaitRes :=
WSAWaitForMultipleEvents(2, @FEvents, False, 15000, False);
case WaitRes of
WSA_WAIT_EVENT_0:
// Π‘ΠΎΠ±ΡΡΠΈΠ΅ FEvents[0] Π²Π·Π²Π΅Π΄Π΅Π½ΠΎ - ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ
// ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ.
begin
LogMessage('Π‘Π΅ΡΠ²Π΅Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠΈΠ³Π½Π°Π» Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ');
// ΠΡΠΎΡΡΠΎ Π²ΡΡ ΠΎΠ΄ΠΈΠΌ ΠΈΠ· ΡΠΈΠΊΠ»Π°, ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠ΄ ΠΏΠΎΡΠ»Π΅ ΡΠΈΠΊΠ»Π°
Break;
end;
WSA_WAIT_EVENT_0 + 1:
// Π‘ΠΎΠ±ΡΡΠΈΠ΅ FEvents[1] Π²Π·Π²Π΅Π΄Π΅Π½ΠΎ.
// ΠΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΠ·Π½Π°ΡΠ°ΡΡ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ FD_ACCEPT.
begin
// ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΠΎΠ±ΡΡΠΈΠ΅ Π²Π·Π²Π΅Π΄Π΅Π½ΠΎ,
// ΠΈ Π·Π°ΠΎΠ΄Π½ΠΎ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ
if WSAEnumNetworkEvents(FServerSocket, FEvents[1], NetEvents) = SOCKET_ERROR then
begin
LogMessage('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΏΠΈΡΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ: ' +
GetErrorString);
Break;
end;
// ΠΠ°ΡΠΈΡΠ° ΠΎΡ "ΡΡΠΏΠΎΠΉ" ΠΎΡΠΈΠ±ΠΊΠΈ - ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΠ³ΠΎ,
// ΡΡΠΎ Π½Π°ΡΡΡΠΏΠΈΠ»ΠΎ Π½ΡΠΆΠ½ΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅
if NetEvents.lNetworkEvents and FD_ACCEPT = 0 then
begin
LogMessage(
'ΠΠ½ΡΡΡΠ΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° - Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅');
Break;
end;
// ΠΡΠΎΠ²Π΅ΡΠΊΠ°, Π½Π΅ Π±ΡΠ»ΠΎ Π»ΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ
if NetEvents.iErrorCode[FD_ACCEPT_BIT] <> 0 then
begin
LogMessage('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°: ' +
GetErrorString(NetEvents.iErrorCode[FD_ACCEPT_BIT]));
Break;
end;
ClientAddrLen := SizeOf(ClientAddr);
// ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
ClientSocket :=
accept(FServerSocket, @ClientAddr, @ClientAddrLen);
if ClientSocket = INVALID_SOCKET then
begin
// ΠΡΠΈΠ±ΠΊΠ° Π² ΡΡΠ½ΠΊΡΠΈΠΈ accept Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π°
// ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π΅ΡΡΠΎ ΡΠΊΡΡΡΠ°ΠΎΡΠ΄ΠΈΠ½Π°ΡΠ½ΠΎΠ΅. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ
// Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅
// Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ - ΠΎΡΠΈΠ±ΠΊΠ° WSAEWOULDBLOCK,
// ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ, Π΅ΡΠ»ΠΈ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ
// Π±ΡΠ»ΠΎ Π»ΠΎΠΆΠ½ΡΠΌ, ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ
if WSAGetLastError <> WSAEWOULDBLOCK then
begin
LogMessage('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°: ' +
GetErrorString);
Break;
end;
end;
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΡ Π½ΠΈΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
// ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π΅ΠΉ ΡΠΎΠΊΠ΅Ρ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π½ΠΈΠΌ.
// Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½ΠΈΡΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π² ΡΠΏΠΈΡΠΊΠ΅
FClientThreads.Add(
TClientThread.Create(ClientSocket, ClientAddr));
end;
WSA_WAIT_TIMEOUT:
// ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΎ ΠΏΠΎ ΡΠ°ΠΉΠΌ-Π°ΡΡΡ
begin
// ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π΅ΡΡΡ Π»ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ Π½ΠΈΡΠΈ, Π·Π°Π²Π΅ΡΡΠΈΠ²ΡΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ.
// ΠΡΠ»ΠΈ Π΅ΡΡΡ ΡΠ°ΠΊΠΈΠ΅ Π½ΠΈΡΠΈ, ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΈΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°
// ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΡ
for I := FClientThreads.Count -1 downto 0 do
if TClientThread(FClientThreads[I]).Finished then
begin
TClientThread(FClientThreads[I]).Free;
FClientThreads.Delete(I);
end;
// ΠΡΠ»ΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ
// Π²ΡΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ
if FServerMsg then
for I := 0 to FClientThreads.Count - 1 do
TClientThread(FClientThreads[I]).SendString(
'ΠΡΠ΅ΠΌΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ' + TimeToStr(Now));
end;
WSA_WAIT_FAILED:
// ΠΡΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ·Π½Π°ΡΠ°ΡΡ
// ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΠ΅ΡΡΠ΅Π·Π½ΡΠΉ ΡΠ±ΠΎΠΉ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΡΠΎΠΊΠ΅ΡΠΎΠ².
begin
LogMessage('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ°: ' +
GetErrorString);
Break;
end;
else
// ΠΠ΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΡΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ
begin
LogMessage(
'ΠΠ½ΡΡΡΠ΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° β Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ '
+ IntToStr(WaitRes));
Break;
end;
end;
until False;
// ΠΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅ΠΌ Π²ΡΠ΅ Π½ΠΈΡΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ²
for I := 0 to FClientThreads.Count - 1 do
begin
TClientThread(FClientThreads[I]).StopThread;
TClientThread(FClientThreads[I]).WaitFor;
TClientThread(FClientThreads[I]).Free;
end;
closesocket(FServerSocket);
LogMessage('Π‘Π΅ΡΠ²Π΅Ρ Π·Π°Π²Π΅ΡΡΠΈΠ» ΡΠ°Π±ΠΎΡΡ');
Synchronize(ServerForm.OnStopServer);
end;
// ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΡΠΎΡΡΠΎ Π²Π·Π²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅
// ΡΠΎΠ±ΡΡΠΈΠ΅, Π° ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠ΄ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ Execute.
procedure TListenThread.StopServer;
begin
WSASetEvent(FEvents[0));
end;
end.
ΠΠΈΡΡ TListenThread ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΠΎΠ½Π° ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΈΡΠΈ Π΄Π»Ρ ΠΈΡ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ. ΠΠΎ-Π²ΡΠΎΡΡΡ , ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π·Π°Π²Π΅ΡΡΠΈΠ²ΡΠΈΡ ΡΡ Π½ΠΈΡΠ΅ΠΉ. Π-ΡΡΠ΅ΡΡΠΈΡ , ΠΎΠ½Π° Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎΡΡΡΡ ΡΡΠ°Π²ΠΈΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π° ΠΎΡΠΏΡΠ°Π²ΠΊΡ Π²ΡΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ°. Π Π²-ΡΠ΅ΡΠ²Π΅ΡΡΡΡ , ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ Π½ΠΈΡΠ΅ΠΉ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΡΡΠ½ΠΈΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ Π²ΡΠ±ΡΠ°Π½ ΡΠ°ΠΊΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ Π½ΠΈΡΠ΅ΠΉ. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ Π½ΠΈΡΠ΅ΠΉ, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΈΡ ΠΈ ΡΡΠ°Π²ΠΈΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ (ΡΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ FClientThreads). ΠΡΠ»ΠΈ Π±Ρ ΠΎΠ±ΡΠ΅ΠΊΡ TClientThread Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Π»ΡΠ»ΡΡ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Π½ΠΈΡΠΈ, Π² Π΅Π³ΠΎ Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°, Π° ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΊ ΡΠΏΠΈΡΠΊΡ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΈΠ· ΡΠ°Π·Π½ΡΡ Π½ΠΈΡΠ΅ΠΉ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ Π±Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠΏΠΈΡΠΊΡ, ΠΈ Π·Π΄Π΅ΡΡ ΠΌΡ Π±Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΠΎΠ΄Π½ΠΎΠΉ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. ΠΠΎΠ³Π΄Π° Π½ΠΈΡΡ TListenThread ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°Π²Π΅ΡΡΠΈΡΡ Π²ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ Π½ΠΈΡΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ ΡΠΏΠΈΡΠΎΠΊ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π° ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ. Π ΠΏΠΎΠ»ΡΡΠΈΠ»Π°ΡΡ Π±Ρ Π²Π·Π°ΠΈΠΌΠ½Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½ΠΈΡΡ TListenThread ΠΆΠ΄Π°Π»Π° Π±Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ Π½ΠΈΡΠ΅ΠΉ, Π° ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΠΌ ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΡΡ Π±Ρ ΡΠΏΠΈΡΠΎΠΊ, Π·Π°Ρ Π²Π°ΡΠ΅Π½Π½ΡΠΉ Π½ΠΈΡΡΡ TListenThread. ΠΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π½ΠΎ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π·Π°ΡΡΡΠ΄Π½ΠΈΡΠ΅Π»ΡΠ½Π° (Ρ ΠΎΡΡ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°). ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ Π±ΡΠ» Π²ΡΠ±ΡΠ°Π½ Π΄ΡΡΠ³ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ: ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ Π½ΠΈΡΠΈ ΡΠ°ΠΌΠΈ ΡΠ²ΠΎΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π΅ ΡΠ΄Π°Π»ΡΡΡ, Π° ΠΊ ΡΠΏΠΈΡΠΊΡ ΠΈΠΌΠ΅Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΡΠΎΠ»ΡΠΊΠΎ Π½ΠΈΡΡ TListenThread, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎ ΠΏΠΎ ΡΠΏΠΈΡΠΊΡ ΠΈ ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π²ΡΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΠ²ΡΠΈΡ ΡΡ Π½ΠΈΡΠ΅ΠΉ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ Π½ΠΈΡΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ, ΠΈ Π½ΠΈΡΡ TListenThread ΠΌΠΎΠΆΠ΅Ρ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡΡ ΠΈΡ .
ΠΠΈΡΡ TListenThread ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄Π²Π° ΡΠΎΠ±ΡΡΠΈΡ: FEvents[0] Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»Π° ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π·Π°ΠΊΡΡΡΠΈΡ ΠΈ FEvents[1] Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ FD_ACCEPT Π½Π° ΡΠ»ΡΡΠ°ΡΡΠ΅ΠΌ ΡΠΎΠΊΠ΅ΡΠ΅ (Ρ.Π΅. ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°). ΠΠΎΡΡΠ΄ΠΎΠΊ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΊ ΠΌΠ°ΡΡΠΈΠ²Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΌΠΈ ΠΆΠ΅ ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ, ΡΡΠΎ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ Π½ΠΈΡΠΈ: ΡΠΈΠ³Π½Π°Π» ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½ΠΈΡΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠΎΠΊΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ. ΡΡΠΎΠ±Ρ Π² ΡΠ»ΡΡΠ°Π΅ DoS-Π°ΡΠ°ΠΊΠΈ Π½ΠΈΡΡ ΠΌΠΎΠ³Π»Π° Π±ΡΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π°.
Π ΠΏΠΎΠΈΡΠΊ Π·Π°Π²Π΅ΡΡΠΈΠ²ΡΠΈΡ ΡΡ Π½ΠΈΡΠ΅ΠΉ, ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΏΡΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ ΠΏΡΠΎΠΈΠ·ΠΎΡΡΠ» ΡΠ°ΠΉΠΌ-Π°ΡΡ (ΠΊΠΎΡΠΎΡΡΠΉ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π²Π΅Π½ 15 c). ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° β ΡΠΎΠ±ΡΡΠΈΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ΅Π΄ΠΊΠΎΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°ΠΊΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ³Π»Π°Π΄ΠΈΡ Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΏΡΠ°Π²Π΄Π°Π½Π½ΡΠΌ. ΠΠ»Ρ ΡΠ΅Ρ ΡΠΊΠ·ΠΎΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΡΠ°ΡΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ°ΡΡΡΡ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ Ρ Π½ΠΈΡΠΈ TListenThread, ΠΏΡΠΈ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠ½Π° Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ². ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠ°Ρ Π½ΠΈΡΡ ΠΏΡΠΈ ΡΠ²ΠΎΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π±ΡΠ΄Π΅Ρ Π²Π·Π²ΠΎΠ΄ΠΈΡΡ ΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅. Π§ΡΠΎ ΠΆΠ΅ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ, ΡΠΎ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠ°ΠΉΠΌ-Π°ΡΡΠ° ΡΡΠΎΡ ΠΊΠΎΠ΄ ΠΏΠΎΠΌΠ΅ΡΡΠ½ Π² Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠ΅Π»ΡΡ . Π ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ Π±ΡΠ΄Π΅Ρ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ΄, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ΄ Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.