'ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ WinSock');
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ "ΡΠ»ΡΡΠ°ΡΡ" ΠΏΠΎΡΡ
MainSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if MainSocket = INVALID_SOCKET then
raise ESocketException.Create(
'ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΠΎΠΊΠ΅Ρ: ' + GetErrorString');
// Π€ΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ° Π΄Π»Ρ "ΡΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ" ΡΠΎΠΊΠ΅ΡΠ°
FillChar(MainSockAddr.sin_zero, SizeOf (MainSockAddr.sin_zero, 0);
MainSockAddr.sin_family := AF_INET;
// ΠΡΠ±ΠΎΡ IP-Π°Π΄ΡΠ΅ΡΠ° Π΄ΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ΅
MainSockAddr.sin_addr.S_addr := INADDR_ANY;
// ΠΠΎΡΡ Π½Π°Π·Π½Π°ΡΠ°Π΅ΠΌ, Π½Π΅ Π·Π°Π±ΡΠ²Π°Ρ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ Π² ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΡΠΎΡΠΌΠ°Ρ
MainSockAddr.sin_port := htons(Port);
// ΠΡΠΈΠ²ΡΠ·ΠΊΠ° ΡΠΎΠΊΠ΅ΡΠ° ΠΊ Π°Π΄ΡΠ΅ΡΡ
if bind(MainSocket, MainSockAddr, SizeOf(MainSockAddr)) = SOCKET_ERROR then
raise ESocketException.Create(
'ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠ²ΡΠ·Π°ΡΡ ΡΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΠΎΠΊΠ΅Ρ ΠΊ Π°Π΄ΡΠ΅ΡΡ: ' +
GetErrorString);
// Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠΎΠΊΠ΅ΡΠ° Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ
if listen(MainSocket, SOMAXCONN) = SOCKET_ERROR then
raise ESocketException.Create(
'ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠΊΠ΅Ρ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ: ' +
GetErrorString);
WriteLn(OemString('Π‘Π΅ΡΠ²Π΅Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π½Π°ΡΠ°Π» ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ° '), Port);
...
// ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΠ°ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 2.15
...
except
on Π: ESocketException do
WriteLn(OemString(E.Message));
on E: Exception do
WriteLn(OemString('ΠΠ΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ' + E.ClassName +
' Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ ' + E.Message));
end;
end.
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π° ΡΠ΅ΡΠ²Π΅ΡΠ° β ΡΡΠΎ Π΄Π²Π° ΡΠΈΠΊΠ»Π°, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π²Π»ΠΎΠΆΠ΅Π½ Π² Π΄ΡΡΠ³ΠΎΠΉ (Π»ΠΈΡΡΠΈΠ½Π³ 2.15). ΠΠ΅ΡΠ΅Π΄ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΡΠ΅ΡΠ²Π΅Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΎΠΊΠ΅Ρ ΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ Π΅Π³ΠΎ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ, ΠΈ Π²Π½Π΅ΡΠ½ΠΈΠΉ ΡΠΈΠΊΠ» Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ accept. ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ accept ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΈΠΊΠ», ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊΠΈ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΎΡΠ²Π΅ΡΠ°. ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΈΠΊΠ» Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠ°Π·ΡΡΠ²Π°Π΅ΡΡΡ Π»ΠΈΠ±ΠΎ ΡΠ°ΠΌΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ, Π»ΠΈΠ±ΠΎ ΠΈΠ·-Π·Π° ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΡΠ΅ΡΠΈ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π²Π½ΠΎΠ²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π½Π° Π½Π°ΡΠ°Π»ΠΎ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΠΈΠΊΠ»Π°, Ρ.Π΅. Π½Π° accept, ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° (ΠΈΠ»ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°).
ΠΠΈΡΡΠΈΠ½Π³ 2.15. ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΠ°ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠ° SimplestServer// ΠΠ°ΡΠ°Π»ΠΎ ΡΠΈΠΊΠ»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
repeat
ClientSockAddrLen := SizeOf(ClientSockAddr);
// ΠΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ»Ρ ΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ Π½ΠΈΠΌ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ
// ΡΠΎΠΊΠ΅Ρ, Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π² ClientSocket.
ClientSocket :=
accept(MainSocket, @ClientSockAddr, @ClientSockAddrLen);
if ClientSocket = INVALID_SOCKET then
raise ESocketException.Create(
'ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°: ' + GetErrorString);
// ΠΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ,
// ΡΡΠΎ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° ΠΈΠΌΠ΅Π΅Ρ ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΡΠΎΡΠΌΠ°Ρ
WriteLn(OemString(' ΠΠ°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Ρ Π°Π΄ΡΠ΅ΡΠ° '),
Ord(ClientSockAddr.sin_addr.S_un_b.s_b1), '.',
Ord(ClientSockAddr.sin_addr.S_un_b.s_b2), '.',
Ord(ClientSockAddr.sin_addr.S_un_b.s_b3), '.',
Ord(ClientSockAddr.sin_addr.S_un_b.s_b4), ':',
ntohs(ClientSockAddr.sin_port));
// Π¦ΠΈΠΊΠ» ΠΎΠ±ΡΠ΅Π½ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ,
// ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ Π·Π°ΠΊΡΠΎΠ΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ°
// Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°
repeat
// Π§ΠΈΡΠ°Π΅ΠΌ Π΄Π»ΠΈΠ½Ρ ΠΏΡΠΈΡΠ»Π°Π½Π½ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΡΡΡΠΎΠΊΠΈ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π΅Π΅ Π² StrLen
case ReadFromSocket(ClientSocket, StrLen, SizeOf(StrLen)) of
0: begin
WriteLn(OemString('ΠΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΊΡΡΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅');
Break;
end;
-1: begin
WriteLn(OemString('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°: ',
GetErrorString));
Break;
end;
end;
// ΠΡΠΎΡΠΎΠΊΠΎΠ» Π½Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ ΡΡΡΠΎΠΊ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ
if StrLen <= 0 then
begin
WriteLn(OemString('ΠΠ΅Π²Π΅ΡΠ½Π°Ρ Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°: '), StrLen);
Break;
end;
// Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊΠΈ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ
SetLength(Str, StrLen);
// Π§ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Π½ΡΠΆΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ
case ReadFromSocket(ClientSocket, Str[1], StrLen) of
0: begin
WriteLn(OemString('ΠΠ»ΠΈΠ΅Π½Ρ Π·Π°ΠΊΡΡΠ» ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅'));
Break;
end;
-1: begin
WriteLn(OemString( 'ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°: ' +
GetErrorString));
Break;
end;
end;
WriteLn(OemString('ΠΠΎΠ»ΡΡΠ΅Π½Π° ΡΡΡΠΎΠΊΠ°: ' + Str));
// ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ
Str :=
AnsiUpperCase(StringReplace(Str, #0, '#0', [rfReplaceAll])) +
' (Simplest server)';
// ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΡΡΠΎΠΊΠΈ. ΠΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ
// Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ, ΡΡΠΎΠ±Ρ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» #0 ΡΠΎΠΆΠ΅ ΠΏΠΎΠΏΠ°Π» Π² ΠΏΠ°ΠΊΠ΅Ρ
if send(ClientSocket, Str[1], Length(Str) + 1, 0) < 0 then
begin
WriteLn(OemString('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ Π΄Π°Π½Π½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ: ' +
GetErrorString));
Break;
end;
WriteLn(OemString('ΠΠ»ΠΈΠ΅Π½ΡΡ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ ΠΎΡΠ²Π΅Ρ: ' + Str));
// ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠΊΠ»Π° ΠΎΠ±ΠΌΠ΅Π½Π° Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
until False;
// Π‘ΠΎΠΊΠ΅Ρ Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ΅Π½
closesocket(ClientSocket);
until False;
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡΠΈΠΌΠ΅Ρ ΡΡΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅ Π² ΠΏΠ°ΠΏΠΊΠ΅ SimpleClient, Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 2.4. ΠΠ»ΠΈΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ·Π²Π°Π²ΡΡΡ Π΅Π΅ Π½ΠΈΡΡ, β ΡΡΠ½ΠΊΡΠΈΡ recv. ΠΠΎ ΠΏΠΎ Π½Π°ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°ΡΠΈΠ²Π΅, ΠΎΠ½ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²ΡΠ΅Π³Π΄Π° Π³ΠΎΡΠΎΠ² ΠΏΡΠΈΠ½ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΎΠ½ Π΅Π³ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠ²ΠΎΠ΅Π³ΠΎ. Π ΠΏΡΠΎΡΡΡΡ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ°Π·ΠΌΠ΅Ρ, Π° ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠ° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ° ΠΎΡ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΅ΠΌΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΏΠΎΠ΄Π°Π²Π»ΡΡΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² Π½Π΅ Π±ΡΠ΄Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Π° ΠΎΡΡΠ°Π²ΡΠ΅Π΅ΡΡ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»ΡΡΠ°Π΅Π² ΡΡΠΈΡΠ°Π΅ΠΌ ΡΠΎΡΡ-ΠΌΠ°ΠΆΠΎΡΠΎΠΌ ΠΈ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ, ΡΡΠΎ Π² ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ. ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° Π·Π°ΠΌΠ΅ΡΠΈΡΡ ΡΡΠΎ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΠ²Π΅Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠ»ΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠ²ΡΠ·Ρ Ρ Π½ΠΈΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΡΠ΅ΡΡΠ½Π°. ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Ρ Π½Π΅Π²ΡΡΠΎΠΊΠΈΠΌΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΠΊ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΠΈ ΡΠ°ΠΊΠΎΠ΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅. Π Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ ΠΌΡ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ ΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠΎΠΊΠ΅ΡΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΌΠΈ ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ΅.
Π ΠΈΡ. 2.4. ΠΠ»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ SimpleClient
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π°Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΡΠΌ: ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π‘ΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡΡΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ ΠΡΠΏΡΠ°Π²ΠΈΡΡ β ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠΆΠΈΠ΄Π°ΡΡΡΡ ΠΎΡΠ²Π΅ΡΠ°. Π’ΡΠ΅ΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΠ°, ΠΡΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ, ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅.
ΠΡΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠΊΠ΅Ρ ΠΈ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ connect. ΠΠ΄Π΅ΡΡ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠΊΠ΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΈ ΠΏΠΎΡΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈΠΌ Π½Π° ΠΏΡΠΎΡΡΠΆΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°Π±ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, Ρ.ΠΊ. ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΊΡΡΡΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ (Π½Π΅Π²Π°ΠΆΠ½ΠΎ, ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ·-Π·Π° ΠΎΡΠΈΠ±ΠΊΠΈ) ΡΠΎΠΊΠ΅Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΡΠΎΠΊΠ΅Ρ. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π‘ΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 2.16.
ΠΠΈΡΡΠΈΠ½Π³ 2.16. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π‘ΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡprocedure TSimpleClientForm.BtnConnectClick(Sender: TObject);
var
// ΠΠ΄ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°
ServerAddr: TSockAddr;
begin
// Π€ΠΎΡΠΌΠΈΡΡΠ΅ΠΌ Π°Π΄ΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ
FillChar(ServerAddr.sin_zero, SizeOf(ServerAddr.sin_zero), 0);
ServerAddr.sin_family := AF_INET;
ServerAddr.sin_addr.S_addr := inet_addr(PChar(EditIPAddress.Text));
// ΠΠ»Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ ΡΠΎ ΡΡΠ°ΡΡΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ Delphi ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ
// ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ INADDR_ANY ΠΊ ΡΠΈΠΏΡ u_long
if ServerAddr.sin_addr.S_addr := u_long(INADDR_NONE)then
begin
MessageDlg('Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ° Π² IΠ -Π°Π΄ΡΠ΅ΡΠ΅', mtError, [mbOK], 0);
Exit;
end;
try
ServerAddr.sin_port := htons(StrToInt(EditPort.Text));
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅ΡΠ°
FSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if FSocket = INVALID_SOCKET then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠΎΠΊΠ΅ΡΠ°: '#13#10 +
GetErrorString, mtError, [mbOK], 0);
Exit;
end;
// ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ
if connect(FSocket, ServerAddr, SizeOf(ServerAddr)) < 0 then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ: '#13#10 +