// ***** ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° C++ *****
int WSARecvFrom(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, struct sockaddr FAR *lpFrom, LPINT lpFromlen, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine;
// ***** ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Delphi *****
function WSARecvFrom(S: TSocket; lpBuffers: PWSABuf; dwBufferCount: DWORD; var NumberOfBytesRecvd: DWORD; var Flags: DWORD; lpFrom: PSockAddr; lpFromLen: PInteger; lpOverlapped: FWSAOverlapped; lpCompletionRoutine: TWSAOverlappedCompletionRoutine): Integer;
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ lpFrom ΠΈ lpFromLen ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠ»ΡΠΆΠ°ΡΠΈΠ΅ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π°Π΄ΡΠ΅ΡΠ° ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ, ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ recvfrom, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΡΠΆΠ΅ Ρ ΠΎΡΠΎΡΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ. Π ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠΌ WSARecvFrom Π²Π΅Π΄Π΅Ρ ΡΠ΅Π±Ρ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ WSARecv, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Π½Π° Π½Π΅ΠΉ.
ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ WSASend ΠΈ WSASendTo, ΠΈΠΌΠ΅ΡΡΠΈΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΠΎΡΠΎΡΠΈΠΏΡ (Π»ΠΈΡΡΠΈΠ½Π³ 2.75).
ΠΠΈΡΡΠΈΠ½Π³ 2.75. Π€ΡΠ½ΠΊΡΠΈΠΈ WSASend ΠΈ WSASendTo// ***** ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° C++ *****
int WSASend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
int WSASendTo(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, const struct sockaddr FAR *lpTo, int iToLen, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
// ***** ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Delphi *****
function WSASend(S: TSocket; lpBuffers: PWSABuf; dwBufferCount: DWORD; var NumberOfBytesRecvd: DWORD; Flags: DWORD; lpOverlapped: PWSAOverlapped; lpCompletionRoutine: TWSAOverlappedCompletionRoutine): Integer;
function WSASendTo(S: TSocket; lpBuffers: PWSABuf; dwBufferCount: DWORD; var NumberOfBytesRecvd: DWORD; Flags: DWORD; var AddrTo: TSockAddr; ToLen: Integer; lpOverlapped: PWSAOverlapped; lpCompletionRoutine: TWSAOverlappedCompletionRoutine): Integer;
ΠΡΠ»ΠΈ Π²Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°Π»ΠΈΡΡ Ρ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ WSARecv, send ΠΈ sendto, ΡΠΎ ΡΠΌΡΡΠ» ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ WSASend ΠΈ WSASendTo Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²Π°ΠΌ ΠΎΡΠ΅Π²ΠΈΠ΄Π΅Π½, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ ΠΌΡ ΠΈΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ. ΠΠΎ ΠΎΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΡΠ»Π°Π³ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΈΡ .
ΠΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π² ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎΠΌ Π²Π²ΠΎΠ΄Π΅-Π²ΡΠ²ΠΎΠ΄Π΅ ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ Π΄Π°Π½Π½ΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ΅Π΄ΠΊΠΎ. ΠΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ WSASend/WSASendTo ΠΌΠΎΠ³ΡΡ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΠ΄ΠΎΠ±Π½ΡΠΌΠΈ ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ΅ ΠΌΠ½ΠΎΠ³ΠΎΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ½ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠΌΠ΅ΡΡ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ ΡΠΈΠ½Π°Π»ΡΠ½ΡΡ ΡΠ°ΡΡΡ. ΠΠ»Ρ ΡΠ°ΠΊΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ Π±ΡΡΠ΅ΡΡ Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ ΠΈ Ρ ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΡΡ ΠΈ, ΠΏΠΎΠ»ΡΠ·ΡΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΈΠ· Π½Π΅ΡΠ²ΡΠ·Π½ΡΡ Π±ΡΡΠ΅ΡΠΎΠ², ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΌΠ΅Π½ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΅Π³ΠΎ ΡΡΠ΅Π΄Π½ΡΡ ΡΠ°ΡΡΡ.
2.2.10. Π‘Π΅ΡΠ²Π΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΡΠΉ Π²Π²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄
Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ (ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠ±ΡΡΠΈΠΉ Π΅ΡΡΡ Π² MSDN Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ WSARecv β ΠΈ WSASend). ΠΠ΅ΡΠ΅ΠΊΡΡΡΡΠΉ Π²Π²ΠΎΠ΄-Π²ΡΠ²ΠΎΠ΄ Π»ΡΡΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ "Π·Π°ΠΏΡΠΎΡ-ΠΎΡΠ²Π΅Ρ", ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π²Π½ΠΎΠ²Ρ Π²Π΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡ ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ. ΠΠ° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ OverlappedServΠ΅r.
ΠΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π·Π°ΠΏΠΈΡΠΈ TConnection, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π° ΡΡΠΎΡ ΡΠ°Π· Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 2.76.
ΠΠΈΡΡΠΈΠ½Π³ 2.76. Π’ΠΈΠΏ TConnection// ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ:
// ClientSocket - ΡΠΎΠΊΠ΅Ρ, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
// ClientAddr - ΡΡΡΠΎΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
// MsgSite - Π΄Π»ΠΈΠ½Π° ΡΡΡΠΎΠΊΠΈ, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΠ°Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
// Msg - ΡΡΡΠΎΠΊΠ°, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΠ°Ρ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠ°Ρ Π΅ΠΌΡ
// Offset - ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ², ΡΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
// ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Π΅ΠΌΡ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅
// BytesLeft - ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±Π°ΠΉΡΠΎΠ² ΠΎΡΡΠ°Π»ΠΎΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
// ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΅ΠΌΡ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ ΡΡΠ°ΠΏΠ΅
// Overlapped - ΡΡΡΡΠΊΡΡΡΠ° Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
PConnection = ^TConnection;
TConnection = record
ClientSocket: TSocket;
ClientAddr: string;
MsgSize: Integer;
Msg: string;
Offset: Integer;
BytesLeft: Integer;
Overlapped: TWSAOverlapped;
end;
ΠΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΡΡΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ° ΡΠΈΠΏΠ° TConnection ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ»ΡΡ ΡΠ°Π½Π΅Π΅ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ NonBlockingServer ΠΈ AsyncSelectServer (ΡΠΌ. ΡΠ°Π·Π΄. 2.1.16 ΠΈ 2.2.6, Π° ΡΠ°ΠΊΠΆΠ΅ Π»ΠΈΡΡΠΈΠ½Π³ 2.31) β ΡΡΠΎ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΏΠΎΠ»Ρ Phase, ΠΊΠΎΡΠΎΡΠΎΠ΅ Ρ ΡΠ°Π½ΠΈΡ ΡΡΠ°ΠΏ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ. Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ OverlappedServer Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π·Π±ΠΈΠ²Π°Π΅ΡΡΡ Π½Π° ΡΡΠΈ ΡΡΠ°ΠΏΠ°, Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΡΡΠ°ΠΏΡ β Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΡΠ°ΠΏΠ° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΡΠ΅Ρ ΡΡΠ°ΠΏΠΎΠ² ΠΈ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ Π² Π½Π΅ΠΉ ΡΡΠ°ΠΏΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠΎΠ»Ρ Phase Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΊΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ.
ΠΠΎΠ»Π΅ Overlapped ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΡΡΡΠΊΡΡΡΡ TWSAOverlapped, ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π½Π΅ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΠΎΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ WSARecv ΠΈ WSASend. ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π°, Π½ΠΎ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ²ΠΎΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ TWSAOverlapped. ΠΠ°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ TWSAOverlapped Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
Π€ΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ β ΡΡΠΎ AcceptEx, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΠΌΡΡ Π² ΡΠ°Π·Π΄. 2.2.12. ΠΠΎ ΠΎΠ½Π° Π½Π΅ΡΠ΄ΠΎΠ±Π½Π° ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ WSARecv ΠΈ WSASend, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π² ΡΠ°ΠΊΠΎΠΌ ΡΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠ·ΡΠΊΠ΅, ΠΊΠ°ΠΊ Delphi. ΠΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΆΠ΅ ΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΡ . ΠΠΎΠ΄ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° OverlappedServer Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΠΎ ΠΊΠΎΠ΄Ρ Π·Π°ΠΏΡΡΠΊΠ° AsyncSelectServer (ΡΠΌ. Π»ΠΈΡΡΠΈΠ½Π³ 2.30): ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠΎΠΊΠ΅Ρ, ΡΡΠ°Π²ΠΈΡΡΡ Π² ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΡΠ»ΡΡΠΈΠ²Π°Π½ΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ FD_ACCEPT ΠΏΡΠΈΠ²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_ACCEPTMESSAGE.
Π‘Π°ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ WM_ACCEPTMESSAGE Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π»ΠΈΡΡΠΈΠ½Π³ 2.77).
ΠΠΈΡΡΠΈΠ½Π³ 2.77. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_ACCEPTMESSAGEprocedure TServerForm.WMAcceptMessage(var Msg: TWMSocketMessage);
var
NewConnection: PConnection;
// Π‘ΠΎΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π΄Π»Ρ Π²Π½ΠΎΠ²Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ClientSocket: TSocket;
// ΠΠ΄ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ClientAddr: TSockAddr;
// ΠΠ»ΠΈΠ½Π° Π°Π΄ΡΠ΅ΡΠ°
AddrLen: Integer;
// ΠΡΠ³ΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΠΎΠΊΠ΅ΡΠ° Π² Π½Π΅Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ ΡΠ΅ΠΆΠΈΠΌ
Arg: u_long;
// ΠΡΡΠ΅Ρ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠ΅ΡΠ΅ΠΊΡΡΡΠΎΠ³ΠΎ ΡΡΠ΅Π½ΠΈΡ
Buf: TWSABuf;
NumBytes, Flags: DWORD;
begin
// Π‘ΡΡΠ°Ρ ΡΠ΅ΠΌΡΡ ΠΎΡ "ΡΡΠΏΠΎΠΉ" ΠΎΡΠΈΠ±ΠΊΠΈ
if Msg.Socket <> FServerSocket then
raise ESocketError.Create(
'ΠΠ½ΡΡΡΠ΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° - Π½Π΅Π²Π΅ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΡΠΎΠΊΠ΅Ρ');
// ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ Π½Π° ΡΠΎΠΊΠ΅ΡΠ΅, Π΅ΡΠ»ΠΈ ΠΎΠ½Π° Π΅ΡΡΡ
if Msg.SockError <> 0 then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°:'#13#10 +
GetErrorString(Msg.SockError) +
#13#10'Π‘Π΅ΡΠ²Π΅Ρ Π±ΡΠ΄Π΅Ρ ocΡΠ°Π½ΠΎΠ²Π»Π΅Π½', mtError, [mbOK], 0);
ClearConnections;
closesocket(FServerSocket);
OnStopServer;
Exit;
end;
// Π‘ΡΡΠ°Ρ ΡΠ΅ΠΌΡΡ ΠΎΡ Π΅ΡΡ ΠΎΠ΄Π½ΠΎΠΉ "ΡΡΠΏΠΎΠΉ" ΠΎΡΠΈΠ±ΠΊΠΈ
if Msg.SockEvent <> FD_ACCEPT then
raise ESocketError.Create(
'ΠΠ½ΡΡΡΠ΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° - Π½Π΅Π²Π΅ΡΠ½ΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅ Π½Π° ΡΠΎΠΊΠ΅ΡΠ΅');
AddrLen := SizeOf(TSockAddr);
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
// ΠΠΎΠ²ΡΠΉ ΡΠΎΠΊΠ΅Ρ Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ ΡΠΎΠΊΠ΅ΡΠ°.
// Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅,
// ΠΈ Π΅Π³ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ FD_ACCEPT ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ WM_ACCEPTMESSAGE.
// Π’Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΠΌ ΡΡΠΎ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, ΠΎΡΠΌΠ΅Π½ΡΠ΅ΠΌ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ
// ΡΠ΅ΠΆΠΈΠΌ ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠΎΠΊΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΌ.
if WSAAsyncSelect(ClientSocket, Handle, 0, 0) = SOCKET_ERROR then
begin
MessageDlg('ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΎΡΠΌΠ΅Π½Π΅ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° ' +
'ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠ²ΡΠ΅Π³ΠΎΡΡ ΡΠΎΠΊΠ΅ΡΠ°:'#13#10 + GetErrorString,
mtError, [mbOK], 0);
closesocket(ClientSocket);