ΠΡΠΎΡΠ°Ρ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅ΡΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠΉ Π²ΡΠ·ΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ WSACancelBlockingΠ‘Π°ll. ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΠ΅ΡΠ²Π°Ρ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡ ΠΏΠΎΠ»ΡΡΠΈΡ ΠΎΡΠΈΠ±ΠΊΡ WSAECANCELLED.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅ΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ WSASetBlockingHook ΠΈ WSAUnhookBlockingHook.
ΠΠ°Π½Π½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ Π½Π΅ΡΠ΄ΠΎΠ±Π½Π°, ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ WinSock 1 ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ², Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΡΠΏΠΎΡΠΎΠ±Π»Π΅Π½Π½ΡΡ ΠΊ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΠΌ Windows.
Π 32-ΡΠ°Π·ΡΡΠ΄Π½ΡΡ Π²Π΅ΡΡΠΈΡΡ WinSock ΡΠ°ΠΊΠ°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² ΠΏΠΎΠ»Π½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΌΠ΅, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΡΠΈ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π΅ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ Π½Π΅ Π²ΡΠ·ΠΎΠ²Π΅ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ WSASetBlockingHook, ΡΠΎ Π² 32-ΡΠ°Π·ΡΡΠ΄Π½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Ρ ΡΠΎΠΊΠ΅ΡΠΎΠΌ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠΆΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄ΡΡΠ³Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, ΠΈ Π²ΡΠΎΡΠΎΠΉ Π°ΠΊΡΠΈΠ²Π°ΡΠΈΠΈ ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΈΠ·-Π·Π° Π±Π»ΠΎΠΊΠΈΡΡΡΡΠ΅Π³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΠΎΠΆΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΎ. ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΡΠ°Π·Π½ΡΠ΅ Π½ΠΈΡΠΈ ΠΌΠΎΠ³ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠΎΠΊΠ΅ΡΠ°ΠΌΠΈ, ΠΈ ΡΡΠΎ Π½Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ WSAEINPROGRESS.
ΠΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½Ρ ΠΈΠ· ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ WinSock 2, Ρ ΠΎΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ½ΠΈ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ WS2_32.dll ΠΈ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½Ρ (ΡΡΠΎ, ΠΏΡΠ°Π²Π΄Π°, ΠΎΡΠ»ΠΎΠΆΠ½ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ Π² Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡΡ MSDN ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ ΠΈΡ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡΠΈΡΠΈΠ½ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π° ΡΡΡ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π² 32-ΡΠ°Π·ΡΡΠ΄Π½ΡΡ Π²Π΅ΡΡΠΈΡΡ Windows, Π²ΠΈΠ΄ΠΈΠΌΠΎ, Π½Π΅Ρ. ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΌΡ Π·Π΄Π΅ΡΡ ΠΏΡΠΈΠ²Π΅Π»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ WSAEINPROGRESS ΠΈ WSAECANCELLED, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ Π² MSDN, Π½Π΅ ΡΠΌΡΡΠ°Π»ΠΈ Π²Π°Ρ.
2.2.3. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅
Π Π°Π½Π΅Π΅ ΠΌΡ ΡΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π°Π½Π½ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠΎΠΊΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ΄Π½ΠΈΠΌΠΈ ΠΈ ΡΠ΅ΠΌΠΈ ΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. ΠΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΡΠΈΡΡΠ²Π°ΡΡ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΠΏΠΎΡΠΎΠΊΠΎΠ²ΡΠΌ, Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ½ΡΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠΌ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠΊΠ΅ΡΠ° ΠΈ Π΄Π»Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎΠ»Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ. Π§ΡΠΎΠ±Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π»ΡΠ±ΡΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠΌ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π²ΡΡ ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΅Π΅ ΡΠ΅ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΠΎΠ³ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΠΎΠΊΠ΅ΡΠΎΠ², ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°, Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π°Π΄ΡΠ΅ΡΠΎΠ², ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ½ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ² ΠΈ Ρ.Π΄. ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° ΠΈ Π΅Π³ΠΎ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ° Π² WinSock 2 ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° ΡΡΡΡΠΊΡΡΡΠ° WSAPROTOCOL_INFO. ΠΠ½Π° Π½Π΅ ΠΎΠΏΠΈΡΠ°Π½Π° Π² ΠΌΠΎΠ΄ΡΠ»Π΅ WinSock, Ρ.ΠΊ. Π² WinSock 1 Π΅Π΅ Π½Π΅Ρ. Π’Π΅ΠΌ, ΠΊΡΠΎ Π·Π°Ρ ΠΎΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π΅Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠΈΡΡΠΈΠ½Π³ 2.36 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΡΠ° ΡΡΡΡΠΊΡΡΡΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 2.36. Π’ΠΈΠΏ WSAPROTOCOL_INFO// ***** ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° C++ *****
typedef struct _WSAPROTOCOLCHAIN {
int ChainLen;
DWORD ChainEntries[MAX_PROTOCOL_CHAIN];
} WSAPROTOCOLCHAIN, *LPWSAPROTOCOLCHAIN;
typedef struct _WSAPROTOCOL_INFO {
DWORD dwServiceFlags1;
DWORD dwServiceFlags2;
DWORD dwServiceFlags3;
DWORD dwServiceFlgs4;
DWORD dwProviderFlags;
GUID ProviderId;
DWORD dwCatalogEntryId;
WSAPROTOCOLCHAIN ProtocolChain;
int iVersion;
int iAddressFamily;
int iMaxSockAddr;
int iMinSockAddr;
int iSocketType;
int iProtocol;
int iProtocolMaxOffset;
int iNetworkByteOrder;
int iSecurityScheme;
DWORD dwMessageSize;
DWORD dwProviderReserved;
TCHAR szProtocol[WSAPROTOCOL_LEN - 1];
} WSAPROTOCOL_INFO, *LPWSAPROTOCOL_INFO;
// ***** ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Delphi *****
TWSAProtocolChain = packed record
ChainLen: Integer;
ChainEntries: array[0..MAX_PROTOCOL_CHAIN - 1] of DWORD;
end;
//Π‘ΡΡΡΠΊΡΡΡΠ° Π½Π° C++ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΈΠΏ TCHAR, ΠΊΠΎΡΠΎΡΡΠΉ, ΠΊΠ°ΠΊ ΠΌΡ
// Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ Π² Π³Π»Π°Π²Π΅ 1, ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ·Π½Π°ΡΠ°ΡΡ ΠΊΠ°ΠΊ Char,
// ΡΠ°ΠΊ ΠΈ WideChar, Ρ.Π΅. ΡΡΡΡΠΊΡΡΡΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ
// Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ: TWSAProtocolInfoA Π΄Π»Ρ
// ΠΎΠ΄Π½ΠΎΠ±Π°ΠΉΡΠ½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ TWSAProtocolInfo Π΄Π»Ρ
// Π΄Π²ΡΡ Π±Π°ΠΉΡΠ½ΠΎΠΉ. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ
// Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°Ρ Π² Π΄Π²ΡΡ Π²Π°ΡΠΈΠ°Π½ΡΠ°Ρ .
// ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ANSI-Π²Π°ΡΠΈΠ°Π½Ρ.
PWSAProtocolInfo = ^TWSAProtocolInfo;
TWSAProtocolInfo = packed record
dwServiceFlags1: DWORD;
dwServiceFlags2: DWORD;
dwServicsFlags3: DWORD;
dwServiceFlags4: DWORD;
dwProviderFlags: DWORD;
ProviderId: GUID;
dwCatalogEntryId: DWORD;
ProtocolChain: TWSAProtocolChain;
iVersion: Integer;
iAddressFamily: Integer;
iMaxSockAddr: Integer;
iMinSockAddr: Integer;
iSocketType: Integer;
iProtocol: Integer;
iProtocolMaxOffset: Integer;
iNetworkByteOrder: Integer;
iSecurityScheme: Integer;
dwMessageSize: DWORD;
dwProviderReserved: DWORD;
szProtocol: array [0..WSAPROTOCOL_LEN] of Char;
end;
Π Π°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ° ΠΏΠΎΠ»Π΅ΠΉ ΡΠΈΠΏΠ° TWSAProtocolInfo Π΅ΡΡΡ Π² MSDN, ΠΌΡ Π·Π΄Π΅ΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π΅Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡ.
Π‘Π°ΠΌΠ° ΡΡΠ½ΠΊΡΠΈΡ WSAEnumProtocols, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΡ ΠΊΠΎΡΠΎΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Ρ Π½Π° ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 2.37.
ΠΠΈΡΡΠΈΠ½Π³ 2.37. Π€ΡΠ½ΠΊΡΠΈΡ WSAEnumProtocols// ***** ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° C++ *****
int WSAEnumProtocols(LPINT lpiProtocols, LPWSAPROTOCOL_INFO lpProtocolBuffer, LPDWORD lpdwBufferLength);
// ***** ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Delphi *****
function WSAEnumProtocols(lpiProtocols: PInteger; lpProtocolBuffer: PWSAProtocolInfo; var BufferLength: DWORD): Integer;
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅Π ΡΡΠ°ΡΡΡ Π²Π΅ΡΡΠΈΡΡ MSDN Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π΅ΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΊΠ°: ΡΠΈΠΏ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° lpdwBufferLength Π½Π°Π·Π²Π°Π½ LLPDWORD Π²ΠΌΠ΅ΡΡΠΎ LPDWORD.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° WS2_32.dll ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅Ρ ΠΆΠ΅ ΠΏΡΠ°Π²ΠΈΠ» Π½Π°ΡΡΠ΅Ρ ANSI- ΠΈ Unicode-Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΡΠΎ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ (ΡΠΌ. ΡΠ°Π·Π΄. 1.1.12), ΠΏΠΎΡΡΠΎΠΌΡ Π² Π½Π΅ΠΉ Π½Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ WSAEnumProtocols, Π° Π΅ΡΡΡ WSAEnumProtocolsA ΠΈ WSAEnumProtocolsW. ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ Π²Π°ΡΠΈΠ°Π½ΡΠ°ΠΌΠΈ ΡΡΡΡΠΊΡΡΡΡ WSAPROTOCOL_INFO, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡΡΡ ΡΠΈΠΏΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅ β CHAR ΠΈΠ»ΠΈ WCHAR.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ lpiProtocols ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΠ²Π°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ. ΠΡΠ»ΠΈ ΡΡΠΎΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠ°Π²Π΅Π½ nil, ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°Ρ . ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ lpProtocolBuffer ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½Π°ΡΠ°Π»ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΡΡΡΠΊΡΡΡ ΡΠΈΠΏΠ° TWSAProtocolInfo. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΡΠ°Π½Π΅Π΅ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΏΠΎΠ΄ ΡΡΠΎΡ ΠΌΠ°ΡΡΠΈΠ². ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ BufferLength ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° lpProtocolBuffer Π² Π±Π°ΠΉΡΠ°Ρ (ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°Π·ΠΌΠ΅Ρ Π² Π±Π°ΠΉΡΠ°Ρ , Π° Π½Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²). ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ΄Π° ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ±ΠΎ Π²ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°Ρ . ΠΡΠ»ΠΈ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ, ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ.
ΠΡΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ lpiProtocols Π½Π΅ ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΌΠ°ΡΡΠΈΠ², Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉΡΡ Π½ΡΠ»Π΅ΠΌ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ, ΡΠ°Π²Π½ΠΎ N, ΡΡΠΎΡ ΠΌΠ°ΡΡΠΈΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· N+1 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΈ ΠΏΠ΅ΡΠ²ΡΠ΅ N ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π½ΠΎΠΌΠ΅ΡΠ° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ β Π½ΠΎΠ»Ρ.
Π ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ² Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π° Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΠ²Π°. ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ ΡΠΈΡΠ»ΠΎ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½Π½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ lpProtocolBuffer ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ lpiProtocols.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠ»Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°ΠΌ ΠΊΠ°ΠΊΠΈΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ, Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π°ΠΉΡΠΈ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ. ΠΠΎΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ TCP Π² ΠΌΠ°ΡΡΠΈΠ² lpiProtocols Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ IPPROTO_TCP, ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ UDP β ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ IPPROTO_UDP.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΠΎ ΡΠΈΡΠ»Ρ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»ΠΎΠ², ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π° Π² ΠΌΠ°ΡΡΠΈΠ², Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈ SOCKET_ERROR, Π΅ΡΠ»ΠΈ ΠΏΡΠΈ Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°. ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ WSAGetLastError. ΠΡΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ² lpProtocolBuffer ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ°Π» Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΉ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ WSAENOBUFS.
WinSock 1 ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΡ EnumProtocols, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ ΠΌΠ°ΡΡΠΈΠ² ΡΡΡΡΠΊΡΡΡ PROTOCOL_INFO. ΠΡΠ° ΡΡΡΡΠΊΡΡΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅, ΡΠ΅ΠΌ WSAPROTOCOL_INFO ΠΈ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΠΌΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ WinSock. ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ EnumProtocols ΠΈ ΡΡΡΡΠΊΡΡΡΠ° PROTOCOL_INFO ΠΎΠΏΠΈΡΠ°Π½Ρ Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ WinSock, ΠΌΠΎΠ΄ΡΠ»Ρ WinSock ΠΈΡ Π½Π΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅Ρ, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΡ Π½ΡΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. ΠΠΎ ΡΡΠ½ΠΊΡΠΈΡ EnumProtocols ΡΡΠΈΡΠ°Π΅ΡΡΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠ΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ Π² Π½ΠΎΠ²ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅Π³Π΄Π°, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ΅Π΄ΠΊΠΈΡ ΡΠ»ΡΡΠ°Π΅Π², ΡΡΠ΅Π±ΡΡΡΠΈΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ Ρ WinSock 1, Π»ΡΡΡΠ΅ Π²ΡΠ±ΡΠ°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ WSAEnumProtocols.