GetErrorString, mtError, [mbOK], 0);
// Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡΠΎΠΊΠ΅Ρ Π±ΡΠ» ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π½,
// Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π΅Π³ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ
closesocket(FSocket);
FSocket := 0;
Exit;
end;
// ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ΅ΠΆΠΈΠΌ "Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ"
OnConnect;
except
on EConvertError do
// ΠΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ -
// ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ StrToInt(EditPort.Text)
MessageDlg('"' + EditPort.Text + '"Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ',
mtError, [mbOK], 0);
on ERangeError do
// ΠΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ -
// ΠΏΡΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½ΠΎΠΌΠ΅ΡΡ ΠΏΠΎΡΡΠ°
MessageDlg('ΠΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 1-65535',
mtError, [mbOK], 0);
end;
end;
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ΅Π°Π³ΠΈΡΡΠ΅Ρ Π½Π° Π½Π°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΡΠΏΡΠ°Π²ΠΈΡΡ (Π»ΠΈΡΡΠΈΠ½Π³ 2.17). Π‘Π°ΠΌΠ° ΠΏΠΎ ΡΠ΅Π±Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° β Π²Π΅ΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠ°Ρ: Π½ΡΠΆΠ½ΠΎ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ Π°Π΄ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΠΈ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ send. ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ , ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ Π½Π°ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ Π·Π½Π°Π΅Ρ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡΠΎΠ² ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ, ΠΈ ΡΠΈΡΠ°Π΅Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π²ΡΡΡΠ΅ΡΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ» #0.
ΠΠΈΡΡΠΈΠ½Π³ 2.17. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΡΠΏΡΠ°Π²ΠΈΡΡprocedure TSimpleClientForm.BtnSendClick(Sender: TObject);
const
// ΠΠ°Π½Π½ΡΠ΅ ΠΈΠ· Π±ΡΡΠ΅ΡΠ° ΡΠΎΠΊΠ΅ΡΠ° ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠΈΡΠ°ΡΡ ΠΏΠΎΡΡΠΈΡΠΌΠΈ.
// ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° BufStep ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠΎΡΡΠΈΠΈ
BufStep = 10;
var
Str: string
StrLen, BufStart, Portion: Integer;
Buf: array of Char;
begin
Str := EditStringToSend.Text;
StrLen := Length(Str);
if StrLen = 0 then
begin
MessageDlg('ΠΡΠΎΡΠΎΠΊΠΎΠ» Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΏΡΡΡΡΡ ΡΡΡΠΎΠΊ',
mtError, [mbOK], 0);
Exit;
end;
// ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΡ Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΈ
if send(FSocket, StrLen, SizeOf(StrLen), 0) < 0 then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ Π΄Π°Π½Π½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΡ '#13#10 +
GetErrorString, mtError, [mbOK], 0);
OnDisconnect;
Exit;
end;
// ΠΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΡ ΡΡΡΠΎΠΊΡ
if send(FSocket, Str[1], StrLen, 0) < 0 then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ Π΄Π°Π½Π½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΡ: '#13#10 +
GetErrorString, mtError, [mbOK], 0);
OnDisconnect;
Exit;
end;
BufStart := 0;
// Π¦ΠΈΠΊΠ» ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°
// Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΠΎΡΡΠ»ΠΊΡ, ΠΎΠΊΠ°Π½ΡΠΈΠ²Π°ΡΡΡΡΡΡ Π½Π° #0
repeat
SetLength(Buf, Length(Buf) + BufStep);
// Π§ΠΈΡΠ°Π΅ΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΡ ΠΏΠΎΡΡΠΈΡ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°
Portion := recv(FSocket, Buf(BufStart), BufStep, 0);
if Portion <= 0 then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°: '#13#10 +
GetErrorString, mtError, [mbOK], 0);
OnDisconnect;
Exit;
end;
// ΠΡΠ»ΠΈ ΠΏΠΎΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ°Π΅ΡΡΡ Π½Π° #0, ΠΎΡΠ²Π΅Ρ ΠΏΡΠΎΡΠΈΡΠ°Π½ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ, Π²ΡΡ ΠΎΠ΄ΠΈΠΌ ΠΈΠ·
// ΡΠΈΠΊΠ»Π°. ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°, ΠΊΠΎΡΠΎΡΡΠΉ
// Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΡ ΠΏΡΠΈΡΡΠ»Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ ΠΏΠΎΠ΄ΡΡΠ΄, ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ
// ΡΡΡΠΎΠΊΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΡΠ»Π°Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ° ΠΎΡ
// ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΠ»ΠΈ Π±Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π΄ΠΎΠΏΡΡΠΊΠ°Π» ΠΎΡΠΏΡΠ°Π²ΠΊΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
// ΠΎΡΠ²Π΅ΡΠΎΠ² ΠΏΠΎΠ΄ΡΡΠ΄, ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΠΏΠΎΡΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠ³Π»ΠΎ Π±Ρ
// ΠΎΠΊΠ°Π·Π°ΡΡΡΡ, ΡΡΠΎ Π½Π°ΡΠ°Π»ΠΎ ΠΏΠΎΡΡΠΈΠΈ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅, ΠΊΠΎΠ½Π΅Ρ -
// ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ, Π° ΠΏΡΠΈΠ·Π½Π°ΠΊ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΊΠ°ΡΡ Π³Π΄Π΅-ΡΠΎ Π² ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅
if Buf[BufStart + Portion - 1] = #0 then
begin
EditReply.Text := PChar(@Buf[0]);
Break;
end;
Inc(BufStart, BufStep);
until False;
end;
Π Π΅Π°ΠΊΡΠΈΡ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ ΠΡΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΡΠΎΠ²ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠ°Ρ: Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·ΠΎΡΠ²Π°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΊΡΡΡΡ ΡΠΎΠΊΠ΅Ρ (Π»ΠΈΡΡΠΈΠ½Π³ 2.18).
ΠΠΈΡΡΠΈΠ½Π³ 2.18. Π Π΅Π°ΠΊΡΠΈΡ Π½Π° Π½Π°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΡΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡprocedure TSimpleClientForm.BtnDisconnectClick(Sender: TObject);
begin
shutdown(FSocket, SD_BOTH);
closesocket(FSocket);
OnDisconnect;
end;
ΠΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌ Π½Π°ΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ. ΠΠΎΠΊΠ° Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΠ½ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, Π²ΡΠ΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ: ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΡΠ΅ΡΠ²Π΅Ρ Π½Π° Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ. ΠΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ Π²ΡΠΎΡΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ, Π½Π΅ ΠΎΡΠΊΠ»ΡΡΠ°Ρ ΠΏΠ΅ΡΠ²ΡΠΉ, ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ. Π‘Π°ΠΌΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, Ρ ΠΎΡΡ ΡΠ΅ΡΠ²Π΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΠ²ΠΎΠ΅ΠΌ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΌ ΡΠΈΠΊΠ»Π΅ ΠΈ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ accept, Π΄Π»Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠΏΡΠΎΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΌΡ Π·Π½Π°Π΅ΠΌ, Π΄Π»Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ connect Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΎΠΊΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π°Ρ ΠΎΠ΄ΠΈΠ»ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ. Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ-ΡΠΎ ΡΠ΅ΡΠ²Π΅ΡΡ ΡΠΎ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. Π‘Π°ΠΌΠ° ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ ΡΡΠΏΠ΅ΡΠ½ΠΎ, Π½ΠΎ ΠΏΡΠΈ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡΠ²Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ "Π·Π°Π²ΠΈΡΠ°Π΅Ρ", Ρ.ΠΊ. ΡΡΠ½ΠΊΡΠΈΡ recv Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π½ΠΈΡΡ Π΄ΠΎ ΠΏΡΠΈΡ ΠΎΠ΄Π° Π΄Π°Π½Π½ΡΡ , Π° Π΄Π°Π½Π½ΡΠ΅ Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ ΡΡΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠ²Π΅Ρ Π²Π΅ΡΠ½ΡΠ»ΡΡ ΠΊ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ accept. ΠΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ» ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎ, ΡΡΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΡΠΈΡΠ»Π°Π» Π΅ΠΌΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π½Π° ΡΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΈ Π²ΡΠΎΡΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ "ΠΎΡΠ²ΠΈΡΠ°Π΅Ρ" β ΡΠ΅ΠΏΠ΅ΡΡ Ρ Π½ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
ΠΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ Ρ Π½ΠΈΠΌ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅Π»ΡΠ½Ρ, Π½ΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ. Π§ΡΠΎΠ±Ρ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΡΠΎΠ³ΠΎ, ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ UDP-ΡΠ°ΡΠ°: Π²ΡΠ½Π΅ΡΠ΅ΠΌ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ Π½ΠΈΡΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ (ΠΏΡΠΈΠΌΠ΅Ρ MultithreadedServer Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅). ΠΠ°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΠΎΠ΄Π½Π° Π½ΠΈΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ accept ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π½ΠΈΡΠΈ Π½Π° ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠΈΠΌΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΠ°ΠΏΡΡΡΠΈΡΡ (Π»ΠΈΡΡΠΈΠ½Π³ 2.19). ΠΠΎΡΠ»Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠΎΠΊΠ΅ΡΠΎΠ², ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅ΡΠ° ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° Π΅Π³ΠΎ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ ΠΎΠ½Π° ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΈΡΡ ΡΠΈΠΏΠ° TListenThread, ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π΅ΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠΎΠΊΠ΅ΡΠ° ΠΈ Π±ΠΎΠ»ΡΡΠ΅ Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ β Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ°Ρ ΡΠΎΠ»Ρ Π³Π»Π°Π²Π½ΠΎΠΉ Π½ΠΈΡΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
ΠΠΈΡΡΠΈΠ½Π³ 2.19. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΠ½ΠΈΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°// Π Π΅Π°ΠΊΡΠΈΡ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ ΠΠ°ΠΏΡΡΡΠΈΡΡ
procedure TServerForm.BtnStartServerClick(Sender: TObject);
var
// Π‘ΠΎΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ "ΡΠ»ΡΡΠ°ΡΡ"
ServerSocket: TSocket;
// ΠΠ΄ΡΠ΅Ρ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΠΎΠΊΠ΅Ρ
ServerAddr: TSockAddr;
begin
// Π€ΠΎΡΠΌΠΈΡyΠ΅ΠΌ Π°Π΄ΡΠ΅Ρ Π΄Π»Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ.
FillChar(ServerAddr.sin_zero, SizeOf(ServerAddr.sin_zero), 0);
ServerAddr.sin_family := AF_INET;
ServerAddr.sin_addr.S_addr := ADDR_ANY;
try
ServerAddr.sin_port := htons(StrToInt(EditPortNumber.Text));
if ServerAddr.sin_port = 0 then
begin
MessageDlg('ΠΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 1-65535',
mtError, [mbOK], 0);
Exit;
end;
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ°
ServerSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
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;
// ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΠΎΠΊΠ΅ΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ
if listen(ServerSocket, SOMAXCONN) = SOCKET_ERROR then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ ΡΠΎΠΊΠ΅ΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΡΡΠΈΠ²Π°Π½ΠΈΡ:'#13#10 +
GetErrorString, mtError, [mbOK], 0);
closesocket(ServerSocket);
Exit;
end;
// ΠΠ°ΠΏΡΡΠΊ Π½ΠΈΡΠΈ, ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°ΡΡΠ΅ΠΉ ΡΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΠΎΠΊΠ΅Ρ
TListenThread.Create(ServerSocket);
// ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ "Π‘Π΅ΡΠ²Π΅Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ"
LabelPortNumber.Enabled := False;
EditΠ ΠΎrtNumber.Enabled := False;
BtnStartServer.Enabled := False;
LabelServerState.Caption := 'Π‘Π΅ΡΠ²Π΅Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ';
except
on EConvertError do
// ΠΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅
// ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ StrToInt(EditPortNumber.Text)
MessageDlg('"' + EditPortNumber.Text + '"Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ',
mtError, [mbOK], 0);
on ERangeError do
// ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ -
// ΠΏΡΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½ΠΎΠΌΠ΅ΡΡ ΠΏΠΎΡΡΠ°
MessageDlg('ΠΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 1-65535',
mtError, [mbOK], 0);