var
// ΠΠ΄ΡΠ΅Ρ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΠΎΠΊΠ΅Ρ
ServerAddr: TSockAddr;
NonBlockingArg: u_long;
begin
// Π€ΠΎΡΠΌΠΈΡΡΠ΅ΠΌ Π°Π΄ΡΠ΅Ρ Π΄Π»Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ.
FillChar(ServerAddr.sin_zero, SizeOf(ServerAddr.sin_zero), 0);
ServerAddr.sin_family := AF_INET;
ServerAddr.sin_addr.S_addr := INADDR_ANY;
try
ServerAddr.sin_port := htons(StrToInt(EditPortNumber.Text));
if ServerAddr.sin_port = 0 then
begin
MessageDlg('ΠΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 1-65535',
mtError, [mbOK], 0);
Exit;
end;
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ°
FServerSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if FServerSocket = INVALID_SOCKET then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΎΠΊΠ΅ΡΠ°: '#13#10 + GetErrorString,
mtError, [mbOK], 0);
Exit;
end;
// ΠΡΠΈΠ²ΡΠ·ΠΊΠ° ΡΠΎΠΊΠ΅ΡΠ° ΠΊ Π°Π΄ΡΠ΅ΡΡ
if bind(FServerSocket, ServerAddr, SizeOf(ServerAddr)) = SOCKET_ERROR then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ΅ ΡΠΎΠΊΠ΅ΡΠ° ΠΊ Π°Π΄ΡΠ΅cΡ: '#13#10 +
GetErrorString, mtError, [mbOK], 0);
closesocket(FServerSocket);
Exit;
end;
// ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΠΎΠΊΠ΅ΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ
if listen(FServerSocket, SOMAXCONN) = SOCKET_ERROR then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ ΡΠΎΠΊΠ΅ΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ:'#13#10 +
GetErrorString, mtError, [mbOK], 0);
closesocket(FServerSocket);
Exit;
end;
// ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΠΎΠΊΠ΅ΡΠ° Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ
NonBlockingArg := 1;
if ioctlsocket(FServerSocket, FIONBIO, NonBlockingArg) = SOCKET_ERROR then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ ΡΠΎΠΊΠ΅ΡΠ° Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ:'#13#10 +
GetErrorString, mtError, [mbOK], 0);
closesocket(FServerSocket);
Exit;
end;
// ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ "Π‘Π΅ΡΠ²Π΅Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ"
LabelPortNumber.Enabled := False;
EditΠ ΠΎrtNumber.Enabled := False;
BtnStartServer.Enabled := False;
TimerRead.Interval := TimerInterval;
LabelServerState.Caption := 'Π‘Π΅ΡΠ²Π΅Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ';
except
on EConvertError do
// ΠΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ -
// ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ StrToInt(EditPortNumber.Text)
MessageDlg('"' + EditPortNumber.Text +
'" Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ', mtError, [mbOK], 0);
on ERangeError do
// ΠΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ -
// ΠΏΡΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½ΠΎΠΌΠ΅ΡΡ ΠΏΠΎΡΡΠ°
MessageDlg('ΠΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 1-65535',
mtError, [mbOK], 0);
end;
end;
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» TCP Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ»ΠΊΠΈ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ° Π² Π±ΡΡΠ΅ΡΠ΅ ΡΠΎΠΊΠ΅ΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΠ» ΠΊΠ»ΠΈΠ΅Π½Ρ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈΡΡ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΈΡΡ, ΡΠΎ ΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° ΠΏΡΠΈΠ΄Π΅Ρ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅, ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π±ΡΠ΄Π΅ΠΌ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ ΡΠΎ, ΡΡΠΎ ΠΏΡΠΈΡΠ»ΠΎ, Π° ΠΏΡΠΈ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΈ ΡΠ°ΠΉΠΌΠ΅ΡΠ°, Π΅ΡΠ»ΠΈ ΠΏΡΠΈΡΠ»ΠΎ Π΅ΡΠ΅ ΡΡΠΎ-ΡΠΎ. Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΡΠΎ ΠΊ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΌ Π΄Π°Π½Π½ΡΠΌ, ΠΈ ΡΠ°ΠΊ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡΠΈΠ΄Π΅Ρ Π²ΡΠ΅, ΡΡΠΎ ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΡΡΠ»ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π·ΠΎΡΠ²Π°ΡΡΡΡ Π² Π»ΡΠ±ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, Π½Π°Ρ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΊ ΡΡΠΎΠΌΡ Π³ΠΎΡΠΎΠ².
ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΡΠ΅Ρ ΡΡΠ°ΠΏΠΎΠ². ΠΠ° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ΅ΡΡΡΡΡ Π±Π°ΠΉΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΈ. ΠΠ° Π²ΡΠΎΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ°ΠΌΡ ΡΡΡΠΎΠΊΡ, ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΈΠ· Π²Π΅Π»ΠΈΡΠΈΠ½Ρ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠ°ΠΏΠ΅. ΠΠ° ΡΡΠ΅ΡΡΠ΅ΠΌ ΡΡΠ°ΠΏΠ΅ ΡΠ΅ΡΠ²Π΅Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΡΠ²Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ, ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· ΡΡΡΠΎΠΊΠΈ, Π·Π°Π²Π΅ΡΡΠ°ΡΡΠ΅ΠΉΡΡ Π½ΡΠ»Π΅ΠΌ. Π§ΡΠΎΠ±Ρ ΠΏΡΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΌ "ΡΠΈΠΊΠ΅" ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠ³ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ, ΠΏΡΠ΅ΡΠ²Π°Π½Π½ΠΎΠ΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡ, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π±ΡΠ»ΠΎ ΠΏΡΠ΅ΡΠ²Π°Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΡΠ°Π·, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡΠΎΠ² Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ ΡΠΆΠ΅ ΠΏΡΠΎΡΠΈΡΠ°Π½ΠΎ ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ ΠΈ ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΅ΡΠ΅ ΠΎΡΡΠ°Π»ΠΎΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ. ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΈΠΏΡ TTransportPhase ΠΈ TConnection (Π»ΠΈΡΡΠΈΠ½Π³ 2.31).
ΠΠΈΡΡΠΈΠ½Π³ 2.31. Π’ΠΈΠΏΡ TTransportPhase ΠΈ TConnectiontype
// ΠΡΠ°ΠΏ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ:
// tpReceiveLength - ΡΠ΅ΡΠ²Π΅Ρ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΈ
// tpReceiveString - ΡΠ΅ΡΠ²Π΅Ρ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΡΡΠΎΠΊΡ
// tpSendString - ΡΠ΅ΡΠ²Π΅Ρ ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΡΡΡΠΎΠΊΡ
TTransportPhase = (tpReceiveLength, tpReceiveString, tpSendString);
// ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ:
// Π‘lientSocket - ΡΠΎΠΊΠ΅Ρ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
// ClientAddr - ΡΡΡΠΎΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
// MsgSize - Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΠ°Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
// Msg - ΡΡΡΠΎΠΊΠ°, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΠ°Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠ°Ρ Π΅ΠΌΡ,
// Phase - ΡΡΠ°ΠΏ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π΄Π°Π½Π½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
// Offset - ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ², ΡΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
// ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ Π΅ΠΌΡ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅
// BytesLeft - ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡΠΎΠ² ΠΎΡΡΠ°Π»ΠΎΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
// ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΅ΠΌΡ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅
PConnection = ^TConnection;
TConnection = record
ClientSocket: TSocket;
ClientAddr: string;
MsgSize: Integer;
Msg: string;
Phase: TTransportPhase;
Offset: Integer;
BytesLeft: Integer;
end;
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π·Π°ΠΏΠΈΡΠΈ TConnection, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ ΡΠ°Π½ΠΈΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΊΠ°ΠΊ ΠΎ ΡΠ°ΠΌΠΎΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ, ΡΠ°ΠΊ ΠΈ ΠΎ ΡΠΎΠΌ, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π΄Π°Π½Π½ΡΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠΈΠΌΠΈΡΡ ΡΠ°Π½Π΅Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ, ΠΊΠ°ΠΊ ΡΠΆΠ΅ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ, ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠΎΠ±ΡΡΠΈΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ°. ΠΠΎΠ΄ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 2.32.
ΠΠΈΡΡΠΈΠ½Π³ 2.32. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠ±ΡΡΠΈΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ°// ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ°
// Π Ρ ΠΎΠ΄Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π²Π½ΠΎΠ²Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠΈΡ ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ²
// Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½ΡΠΌΠΈ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ
procedure TServerForm.TimerReadTimer(Sender: TObject);
var
// Π‘ΠΎΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π΄Π»Ρ Π²Π½ΠΎΠ²Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ClientSocket: TSocket;
// ΠΠ΄ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ClientAddr: TSockAddr;
// ΠΠ»ΠΈΠ½Π° Π°Π΄ΡΠ΅ΡΠ°
AddrLen: Integer;
// ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
NewConnection: PConnection;
I: Integer;
begin
AddrLen := SizeOf(TSockAddr);
// ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡΠΎΠΊΠ΅Ρ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ,
// accept Π½Π΅ Π±ΡΠ΄Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΈΡΡ Π΄Π°ΠΆΠ΅ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ
// ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ.
ClientSocket := accept(FServerSocket, @ClientAddr, @AddrLen);
if ClientSocket = INVALID_SOCKET then
begin
// ΠΡΠ»ΠΈ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π΄ΡΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ° - WSAEWOULDBLOCK, ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ,
// ΡΡΠΎ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π½Π΅Ρ, Π° Π²ΠΎΠΎΠ±ΡΠ΅ Π²ΡΠ΅ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅,
// ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΡΠΈΠ±ΠΊΡ WSAEWOULDBLOCK ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΠΌ. ΠΡΠΎΡΠΈΠ΅ ΠΆΠ΅
// ΠΎΡΠΈΠ±ΠΊΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°Π΅ ΡΠ΅ΡΡΠ΅Π·Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ,
// ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅Π±ΡΡΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°.
if WSAGetLastError <> WSAEWOULDBLOCK then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°:'#13#10 +
GetErrorString + #13#10'Π‘Π΅ΡΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½', mtError, [mbOK], 0);
ClearConnections;
closesocket(FServerSocket);
OnStopServer;
end;
end
else
begin
// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π·Π°ΠΏΠΈΡΡ Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π΅Π΅
New(NewConnection);
NewConnection.ClientSocket := ClientSocket;
NewConnection.Π‘lientAddr :=
Format('%u.%u.%u.%u:%u', [
Ord(ClientAddr.sin_addr.S_un_b.s_b1),
Ord(ClientAddr.sin_addr.S_un_b.s_b2),
Ord(ClientAddr.sin_addr.S_un_b.s_b3),
Ord(ClientAddr.sin_addr.S_un_b.s_b4),
ntohs(ClientAddr.sin_port)]);
NewConnection.Phase := tpReceiveLength;
NewConnection.Offset := 0;
NewConnection.BytesLeft := SizeOf(Integer);
// ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π² ΡΠΏΠΈΡΠΎΠΊ
FConnections.Add(NewConnection);
AddMessageToLog('ΠΠ°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Ρ Π°Π΄ΡΠ΅ΡΠ° ' +
NewConnection.ClientAddr);
end;
// ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ Π²ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ.
// Π¦ΠΈΠΊΠ» ΠΈΠ΄Π΅Ρ ΠΎΡ ΠΊΠΎΠ½ΡΠ° ΡΠΏΠΈΡΠΊΠ° ΠΊ Π½Π°ΡΠ°Π»Ρ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π² Ρ ΠΎΠ΄Π΅
// ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ΄Π°Π»Π΅Π½ΠΎ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°.
for I := FConnections.Count - 1 downto 0 do processConnection(I);
end;
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠΎΠΊΠ΅Ρ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ accept, Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡΡ Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ. ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΠΎΠΊΠ΅Ρ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ ΠΎΠ½ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ°Π·Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΌ.
Π‘ΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ Π²ΡΠ½Π΅ΡΠ΅Π½ΠΎ Π² ΠΌΠ΅ΡΠΎΠ΄ ProcessConnection (Π»ΠΈΡΡΠΈΠ½Π³ 2.33). ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΡ Π΄Π°Π½Π½ΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΡΠ°ΠΏΠΎΠΌ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΎΡΡΠΎ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡΡ Π·Π° ΡΠ΅ΠΌ, ΠΊΡΠ΄Π° ΠΈ ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄Π°Π½Π½ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ.