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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 96

Автор ДТонсон Π₯Π°Ρ€Ρ‚

β€’ Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ дСскрипторы (Ρ‚ΠΈΠΏΠ° HANDLE) Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΈ использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ReadFile ΠΈ WriteFile ΠΈ, с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ограничСниями, ΠΏΡ€ΠΈ использовании Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² качСствС дСскрипторов Ρ„Π°ΠΉΠ»ΠΎΠ² сокСты ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² UNIX. Π­Ρ‚Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ оказываСтся ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° трСбуСтся использованиС асинхронного Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ΠΏΠΎΡ€Ρ‚ΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°.

β€’ Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅, нСпСрСносимыС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Winsock

Winsock API поддСрТиваСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ DLL (WS2_32.DLL), для получСния доступа ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слСдуСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ WS_232.LIB. Π­Ρ‚Ρƒ DLL слСдуСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нСстандартной, спСцифичСской для Winsock Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WSAStartup, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Winsock, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ. Когда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² использовании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй Winsock ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚, слСдуСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WSACleanup. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ WSA ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "Windows Sockets asynchronous …" ("Асинхронный Windows Sockets …"). БрСдства асинхронного Ρ€Π΅ΠΆΠΈΠΌΠ° Winsock Π½Π°ΠΌΠΈ здСсь Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ нСобходимости Π² Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ асинхронных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ.

Π₯отя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WSAStartup ΠΈ WSACleanup Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ порядкС, Π²ΠΏΠΎΠ»Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ СдинствСнными нСстандартными функциями, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Π°ΠΌ придСтся ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ. РаспространСнной ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ являСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² прСпроцСссора #ifdef для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ значСния символичСской константы _WIN32 (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ опрСдСляСтся Visual C++ Π½Π° стадии компиляции), Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WSA Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π² Windows). РазумССтся, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π½Π΅ зависит ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.

int WSAStartup(WORD wVersionRequired, LPWSADATA ipWSAData);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

wVersionRequired β€” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ DLL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π°ΠΌ трСбуСтся ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, вСрсии 1.1 Π²ΠΏΠΎΠ»Π½Π΅ достаточно для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ любоС взаимодСйствиС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ систСмами, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρƒ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²ΠΎ всСх систСмах Windows, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Windows 9x, доступна вСрсия Winsock 2.0, которая ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…. ВСрсия 1.1 считаСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅ΠΉ ΠΈ постСпСнно Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· употрСблСния. 

Ѐункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Π°Ρ Π²Π°ΠΌΠΈ вСрсия Π΄Π°Π½Π½ΠΎΠΉ DLL Π½Π΅ поддСрТиваСтся.

Младший Π±Π°ΠΉΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° wVersionRequired ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ основной Π½ΠΎΠΌΠ΅Ρ€ вСрсии, Π° ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚ β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ макрос MAKEWORD; Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ MAKEWORD (2,0) прСдставляСт Π²Π΅Ρ€ΡΠΈΡŽ 2.0.

ipWSAData β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру WSADATA, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ DLL, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ доступный Π½ΠΎΠΌΠ΅Ρ€ вСрсии. О Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ содСрТимоС, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ справки Visual Studio.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ WSAGetLastError, Π½ΠΎ для этой Ρ†Π΅Π»ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ функция GetLastError, Π° Ρ‚Π°ΠΊΠΆΠ΅ функция ReportError, разработанная Π² Π³Π»Π°Π²Π΅ 2.

По ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° нСобходимости Π² использовании сокСтов большС Π½Π΅Ρ‚, слСдуСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ WSACleanup, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° WS_32.DLL, ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰Π°Ρ сокСты, ΠΌΠΎΠ³Π»Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ рСсурсы, распрСдСлСнныС для этого процСсса.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ сокСта

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π² Winsock DLL, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС (Berkeley Sockets) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для создания сокСтов ΠΈ соСдинСний, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… взаимодСйствиС сСрвСров с ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ взаимодСйствиС Ρ€Π°Π²Π½ΠΎΠΏΡ€Π°Π²Π½Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² сСти ΠΌΠ΅ΠΆΠ΄Ρƒ собой.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π² Winsock Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… SOCKET Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Ρ‚ΠΈΠΏΡƒ Π΄Π°Π½Π½Ρ‹Ρ… HANDLE Π² Windows, ΠΈ Π΅Π³ΠΎ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ совмСстно с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ReadFile ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ функциями Windows, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌΠΈ использования дСскрипторов Ρ‚ΠΈΠΏΠ° HANDLE. Для создания (ΠΈΠ»ΠΈ открытия) сокСта слуТит функция socket. 

SOCKET socket(int af, int type, int protocol); 

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

Π’ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… SOCKET фактичСски опрСдСляСтся ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… int, ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠΎΠ΄ UNIX остаСтся пСрСносимым, Π½Π΅ трСбуя привлСчСния Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Windows.

af β€” ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ сСмСйство адрСсов, ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»; для указания ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° IP (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° TCP/IP, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Internet) слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ PF_INET (ΠΈΠ»ΠΈ AF_INET, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎ ΠΆΠ΅ самоС числовоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind).

type β€” ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ взаимодСйствия: ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π½Π° установку соСдинСния (connection-oriented communication), ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²ΠΎΠ΅ (SOCK_STREAM), ΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ (datagram communication) (SOCK_DGRAM), Ρ‡Ρ‚ΠΎ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ стСпСни сопоставимо соотвСтствСнно с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹ΠΌΠΈ ящиками. 

protocol β€” являСтся излишним, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ af установлСн Ρ€Π°Π²Π½Ρ‹ΠΌ AF_INET; ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0.

Π’ случаС Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ функция socket Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ INVALID_SOCKET.

Winsock ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ совмСстно с ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ TCP/IP, указывая Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° protocol; ΠΌΡ‹ ΠΆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP/IP.

Как ΠΈ Π² случаС всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… стандартных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ socket Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ прописных Π±ΡƒΠΊΠ². Π­Ρ‚ΠΎ являСтся ΠΎΡ‚Ρ…ΠΎΠ΄ΠΎΠΌ ΠΎΡ‚ соглашСний, принятых Π² Windows, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΈΠΊΡ‚ΠΎΠ²Π°Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ соблюдСния ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹Ρ… стандартов.

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сокСта

Π’ Π½ΠΈΠΆΠ΅ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ обсуТдСнии ΠΏΠΎΠ΄ сСрвСром Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ процСсс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ запросы Π½Π° ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ соСдинСния Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚. НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ сокСты, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для создания соСдинСний ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π²Π½ΠΎΠΏΡ€Π°Π²Π½Ρ‹ΠΌΠΈ ΡƒΠ·Π»Π°ΠΌΠΈ сСти, Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ различия ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠ·Π»Π°ΠΌΠΈ являСтся вСсьма ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ различия Π² способах, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΎΠ±Π΅ΠΈΠΌΠΈ систСмами для соСдинСния Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ.

Если Π½Π΅ ΠΎΠ³ΠΎΠ²ΠΎΡ€Π΅Π½ΠΎ ΠΈΠ½ΠΎΠ΅, Ρ‚ΠΈΠΏΠΎΠΌ сокСтов Π² Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… всСгда Π±ΡƒΠ΄Π΅Ρ‚ SOCK_STREAM. Π‘ΠΎΠΊΠ΅Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠ° SOCK_DGRAM рассматриваСтся Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅.

БвязываниС сокСта

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² привязкС сокСта ΠΊ Π΅Π³ΠΎ адрСсу ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ (endpoint) (Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° связи ΠΎΡ‚ прилоТСния ΠΊ слуТбС). Π’Ρ‹Π·ΠΎΠ² socket, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Π²Ρ‹Π·ΠΎΠ² bind, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ созданию ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°. Однако Π½Π΅ сущСствуСт ΠΈΠΌΠ΅Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ сокСты Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. ВмСсто этого Π² качСствС ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ слуТбы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° (port number). Π›ΡŽΠ±ΠΎΠΉ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ. ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bind приводится Π½ΠΈΠΆΠ΅. 

int bind(SOCKET s, const struct sockaddr *saddr, int namelen);

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹

s β€” нСсвязанный сокСт, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ socket.

saddr β€” заполняСтся ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΈ Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΈ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ для ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΊΠ°ΠΊ описано Π½ΠΈΠΆΠ΅. ΠšΡ€ΠΎΠΌΠ΅ всСго ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, Π² этой структурС содСрТится Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°. 

namelen β€” присвойтС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ sizeof (sockaddr).

Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, ΠΈΠ½Π°Ρ‡Π΅ SOCKET_ERROR. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° sockaddr опрСдСляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: 

struct sockaddr {

 u_short sa_family;

 char sa_data[14] ;

};

typedef struct sockaddr SOCKADDR, *PSOCKADDR; 

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ‡Π»Π΅Π½ этой структуры, sa_family, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‡Π»Π΅Π½, sa_data, зависит ΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. Internet-вСрсиСй структуры sa_data являСтся структура sockaddr_in: 

struct sockaddr_in {

 short sin_family; /* AF_INET */

 u_short sin_port;

 struct in_addr sin_addr; /* 4-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ IP-адрСс */

 char sin_zero[8];

};

typedef struct sockaddr_in SOCKADDR_IN, *PSOCKADDR IN; 

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° использованиС Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ… short integer для Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° ΠΈ иная информация Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ с соблюдСниСм подходящСго порядка слСдования Π±Π°ΠΉΡ‚ΠΎΠ², ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚ помСщаСтся Π² ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ справа (big-endian), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π»Π°ΡΡŒ двоичная ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ систСмами. Π’ структурС sin_addr содСрТится подструктура s_addr, заполняСмая ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌ Π½Π°ΠΌ 4-Π±Π°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΌ IP-адрСсом, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 127.0.0.1, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ систСму, Ρ‡Π΅ΠΉ запрос Π½Π° ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ соСдинСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ принят. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ΡΡ запросы Π»ΡŽΠ±Ρ‹Ρ… систСм, Π² связи с Ρ‡Π΅ΠΌ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ INADDR_ANY, хотя этот символичСский ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ ΠΊ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π°.

Для прСобразования тСкстовой строки с IP-адрСсом ΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ inet_addr, поэтому Ρ‡Π»Π΅Π½ sin_addr.s_addr ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ sockaddr_in инициализируСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

sa.sin_addr.s_addr = inet_addr("192 .13.12.1");

О связанном сокСтС, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π° ΠΈ IP-адрСс, ΠΈΠ½ΠΎΠ³Π΄Π° говорят ΠΊΠ°ΠΊ ΠΎΠ± ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌ сокСтС (named socket). 

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ связанного сокСта Π² состояниС ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Π½ΠΈΡ

Ѐункция listen Π΄Π΅Π»Π°Π΅Ρ‚ сСрвСр доступным для образования соСдинСния с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. Аналогичной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² Π½Π΅ сущСствуСт.