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

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

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

ΠΠΈΡ‚ΡŒ, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π°Ρ Π΄Π°Π½Π½Ρ‹Π΅, создаСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ β€” ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ наслСдника ΠΎΡ‚ класса TThread. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²ΠΎΠ·Π»Π°Π³Π°Ρ‚ΡŒ Π½Π° эту Π½ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ создания сокСта, β€” ΠΏΡƒΡΡ‚ΡŒ ΠΎΠ½ создаСтся Π² Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ, Π° Π·Π°Ρ‚Π΅ΠΌ Π΅Π³ΠΎ дСскриптор пСрСдаётся Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ, которая сохраняСт Π΅Π³ΠΎ Π² своСм Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ ΠΏΠΎΠ»Π΅ FSocket. Код Π½ΠΈΡ‚ΠΈ, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅ΠΉ сообщСния, ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² листингС 2.7.

Листинг 2.7. Код "Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅ΠΉ" Π½ΠΈΡ‚ΠΈ

unit ReceiveThread;

{

 Π’ этом ΠΌΠΎΠ΄ΡƒΠ»Π΅ рСализуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Π½ΠΈΡ‚ΡŒ UDP-Ρ‡Π°Ρ‚Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π°Ρ Π·Π° ΠΏΡ€ΠΈΠ΅ΠΌ сообщСний.

}

interface


uses

 SysUtils, Classes, WinSock;


type

 TReceiveThread = class(TThread)

 private

  // Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π»ΠΎΠ³,

  // хранится Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΠΎΠ»Π΅, Ρ‚.ΠΊ. ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉΡΡ Ρ‡Π΅Ρ€Π΅Π·

  // Synchronize, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

  FMessage: string;

  // Π‘ΠΎΠΊΠ΅Ρ‚, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ сообщСния

  FSocket: TSocket;

  // Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ для Π²Ρ‹Π·ΠΎΠ²Π° Ρ‡Π΅Ρ€Π΅Π· Synchronize

  procedure DoLogMessage;

 protected

  procedure Execute; override;

  // Π’Ρ‹Π²ΠΎΠ΄ сообщСния Π² Π»ΠΎΠ³ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹

  procedure LogMessage(const Msg: string);

 public

  constructor Create(ServerSocket: TSocket);

 end;


implementation


uses ChatMainUnit;


{TReceiveThread}


// Π‘ΠΎΠΊΠ΅Ρ‚, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ сообщСния, создаСтся Π² Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡ‚ΠΈ,

// Π° сюда пСрСдаётся Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ конструктора

constructor TReceiveThread.Create(ServerSocket: TSocket);

begin

 FSocket := ServerSocket;

 inherited Create(False);

end;


procedure TReceiveThread.Execute;

var

 // Π‘ΡƒΡ„Π΅Ρ€ для получСния сообщСния.

 // Π Π°Π·ΠΌΠ΅Ρ€ Ρ€Π°Π²Π΅Π½ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ UDP-Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹

 Buffer: array[0..65506] of Byte;

 // АдрСс, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΡˆΠ»ΠΎ сообщСниС

 RecvAddr: TSockAddr;

 RecvLen, AddrLen: Integer;

 Msg: string;

begin

 // НачинаСм бСсконСчный Ρ†ΠΈΠΊΠ», Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ

 // читаСтся ΠΎΠ΄Π½Π° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°

 repeat

  AddrLen := SizeOf(RecvAddr);

  // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ

  RecvLen :=

   recvfrom(FSocket, Buffer, SizeOf(Buffer), 0, RecvAddr, AddrLen);

  // Π’Π°ΠΊ ΠΊΠ°ΠΊ UDP Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ соСдинСниС, ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ recvfrom

  // ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΡΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ совсСм

  // экстраординарноС. Π’ этом случаС Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½ΠΈΡ‚ΠΈ.

  if RecvLen < 0 then

  begin

   LogMessage('Ошибка ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСния: ' + GetErrorString);

   // ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ элСмСнтов управлСния Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹

   // Π² состояниС "Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚"

   SynchronizΠ΅(ChatForm.OnStopServer);

   Break;

  end;

  // УстанавливаСм Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ строки

  SetLength(Msg, RecvLen);

  // ΠΈ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Π² Π½Π΅Π΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π°

  if RecvLen > 0 then Move(Buffer, Msg[1], RecvLen);

  LogMessage('Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ с адрСса ' + inet_ntoa(RecvAddr.sin_addr) + ':' +

   IntToStr(ntohs(RecvAddr.sin_port)) + ':' + Msg);

 until False;

 closesocket(FSocket);

end;


procedure TReceiveThread.LogMessage(const Msg: string);

begin

 FMessage := Msg;

 Synchronize(DoLogMessage);

end;


procedure TReceiveThread.DoLogMessage;

begin

 ChatForm.AddMessageToLog(FMessage);

end;


end.

ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΈΠ· основной Π½ΠΈΡ‚ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ функция sendto ΠΏΡ€ΠΈ Π½Π°ΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΌΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ… практичСски Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π΅Π΅ Π½ΠΈΡ‚ΡŒ (Π΄Π° ΠΈ ΠΏΡ€ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΌΠ°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² дальнСйшСм, этого практичСски Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚). БоотвСтствСнно, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° сокСта: ΠΎΠ΄ΠΈΠ½ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний, Π΄Ρ€ΡƒΠ³ΠΎΠΉ для ΠΏΡ€ΠΈΠ΅ΠΌΠ°. Π‘ΠΎΠΊΠ΅Ρ‚ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний создаСм сразу ΠΆΠ΅ ΠΏΡ€ΠΈ запускС прилоТСния, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ события OnCreate Π³Π»Π°Π²Π½ΠΎΠΉ (ΠΈ СдинствСнной) Ρ„ΠΎΡ€ΠΌΡ‹. ДСскриптор сокСта хранится Π² ΠΏΠΎΠ»Π΅ FSendSocket. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π½Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ€Ρ‚ Π·Π°ΠΉΠΌΠ΅Ρ‚ этот сокСт, поэтому ΠΌΡ‹ довСряСм Π΅Π³ΠΎ Π²Ρ‹Π±ΠΎΡ€ систСмС (листинг 2.8).

Листинг 2.8. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ UDPChat

procedure TChatForm.FormCreate(Sender: TObject);

var

 // Π‘Π΅Π· этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π΅ удастся ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ сокСтов

 WSAData: TWSAData;

 // АдрСс, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ привязываСтся сокСт для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний

 Addr: TSockAddr;

 AddrLen: Integer;

begin

 // инициализация Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ сокСтов

 if WSAStartup($101, WSAData) <> 0 then

 begin

  MessageDlg('Ошибка ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ WinSock',

   mtError, [mbOK], 0);

  Application.Terminate;

 end;

 // ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ элСмСнтов управлСния Π² состояниС "Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚"

 OnStopServer;

 // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сокСта

 FSendSocket := socket(AF_INET, SOCK_DGPAM, IPROTO_UDP);

 if FSendSocket = INVALID_SOCKET then

 begin

  MessageDlg('Ошибка ΠΏΡ€ΠΈ создании ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ сокСта:'#13#10 +

   GetErrorString, mtError, [mbOK], 0);

  Exit;

 end;

 // Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ адрСса, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ привязан сокСт

 // для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний

 FillChar(Addr.sin_zero, SizeOf(Addr.sin_zero), 0);

 Addr.sin_family := AF_INET;

 // ΠŸΡƒΡΡ‚ΡŒ систСма сама Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ для Π½Π΅Π³ΠΎ IP-адрСс ΠΈ ΠΏΠΎΡ€Ρ‚

 Addr.sin_addr.S_addr := INADDR_ANY;

 Addr.sin_port := 0;

 // ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° сокСта ΠΊ адрСсу

 if bind(FSendSocket, Addr, SizeOf(Addr)) = SOCKET_ERROR then

 begin

  MessageDlg('Ошибка ΠΏΡ€ΠΈ привязкС ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ сокСта ΠΊ адрСсу:'#13#10 +

   GetErrorString, mtError, [mbOK], 0);

  Exit;

 end;

 // Π£Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ адрСс систСма Π½Π°Π·Π½Π°Ρ‡ΠΈΠ»Π° сокСту

 // Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

 AddrLen := SizeOf(Addr);

 if getsockname(FSendSocket, Addr, AddrLen) = SOCKET_ERROR then

 begin

  MessageDlg('Ошибка ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ адрСса ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ сокСта:'#13#10 +

   GetErrorString, mtError, [mbOK], 0);

  Exit;

 end;

 // НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° возвращаСтся Π² сСтСвом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅,

 // ΠΈ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ htons.

 LabelSendPort.Caption := 'ΠŸΠΎΡ€Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ: ' + IntToStr(ntohs(Addr.sin_port));

end;

Π‘ΠΎΠΊΠ΅Ρ‚ для получСния сообщСний создаСтся ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈ привязываСтся ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΡ€Ρ‚Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Π» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ. Π’ случаС Π΅Π³ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ создания запускаСтся Π½ΠΈΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ пСрСдаСтся этот сокСт, ΠΈ всС дальнСйшиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π½ΠΈΠΌ выполняСт эта Π½ΠΈΡ‚ΡŒ. ΠΠΈΡ‚ΡŒ вмСстС с этим сокСтом ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ условно Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ сСрвСром. Код ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² листингС 2.9.

Листинг 2.9. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ

// РСакция Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ "Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ"

procedure TChatForm.BtnStartServerClick(Sender: TObject);

var

 // Π‘ΠΎΠΊΠ΅Ρ‚ для ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний

 ServerSocket: TSocket;

 // АдрСс, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ привязываСтся сокСт для ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний

 ServerAddr: TSockAddr;

begin

 // Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ адрСса сокСта для ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний

 FillChar(ServerAddr.sin_zero, SizeOf(ServerAddr.sin_zero), 0);

 ServerAddr.sin_family := AF_INET;

 // IP-адрСс ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ систСма, Π° ΠΏΠΎΡ€Ρ‚ Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌ Ρ‚ΠΎΡ‚,

 // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π΄Π°Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ

 ServerAddr.sin_addr.S_addr := INADDR_ANY;

 try

  // He Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° ΠΊ сСтСвому Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ

  // с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ htons

  ServerAddr.sin_port := htons(StrToInt(EditServerPort.Text));

  if ServerAddr.sin_port = 0 then

  begin

   MessageDlg('НомСр ΠΏΠΎΡ€Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 1-65535',

    mtError, [mbOK], 0);

   Exit;

  end;

  // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сокСта для получСния сообщСний

  ServerSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

  if ServerSocket = INVALID_SOCKET then

  begin

   MessageDlg('Ошибка ΠΏΡ€ΠΈ создании сокСта: '#13#10 + GetErrorString,

    mtError, [mbOK], 0);

   Exit;

  end;

  // привязка сокСта ΠΊ адрСсу

  if bind(ServerSocket, ServerAddr, SizeOf(ServerAddr)) = SOCKET_ERROR then

  begin

   MessageDlg('Ошибка ΠΏΡ€ΠΈ привязкС сокСта ΠΊ адрСсу: '#13#10 + GetErrorString,

    mtError, [mbOK], 0);

   closesocket(ServerSocket);

   Exit;

  end;

  // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΈΡ‚ΠΈ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ сообщСния.

  // Π‘ΠΎΠΊΠ΅Ρ‚ пСрСдаСтся Π΅ΠΉ, ΠΈ дальшС ΠΎΠ½Π° ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π½Π΅Π³ΠΎ.

  TReceiveThread.Create(ServerSocket);

  // ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ элСмСнтов управлСния Π² состояниС "Π‘Π΅Ρ€Π²Π΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚"

  LabelServerPort.Enabled := False;

  EditServerPort.Enabled := False;

  BtnStartServer.Enabled := False;