Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 70

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

Вторая активация ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 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.