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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 83

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

 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, ΠΏΡ€ΠΈ наступлСнии ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ список ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ своСм Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ это событиС. Π§Ρ‚ΠΎ ΠΆΠ΅ касаСтся ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ, Ρ‚ΠΎ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Π° этот ΠΊΠΎΠ΄ ΠΏΠΎΠΌΠ΅Ρ‰Ρ‘Π½ Π² дСмонстрационных цСлях. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сообщСний ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚, скорСС всСго, Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ΄, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ΄ Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.