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

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

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

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ²

Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 11.2, для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ примСняСтся функция CreateFile, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ указываСтся имя ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°. Часто ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, ΠΈ Π² этом случаС для указания ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Π½Π°Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ°:

\\.\pipe\[path]pipename

Если сСрвСр находится Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, для указания ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠ°Π½Π°Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ°:

\\servername\pipe\[path]pipename

ИспользованиС Ρ‚ΠΎΡ‡ΠΊΠΈ (.) вмСсто ΠΈΠΌΠ΅Π½ΠΈ локального ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π² случаС, ΠΊΠΎΠ³Π΄Π° сСрвСр являСтся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ, позволяСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ состояния ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ²

ΠŸΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½Ρ‹ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ состоянии ΠΊΠ°Π½Π°Π»ΠΎΠ², ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° функция, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ состояния ΠΊΠ°Π½Π°Π»Π°. ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ характСристика этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ приводится Π½ΠΈΠΆΠ΅, Π° ΠΎΠ΄Π½Π° ΠΈΠ· этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 11.2.

β€’ GetNamedPipeHandleState β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ дСскриптора ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π»ΠΈ ΠΊΠ°Π½Π°Π» Π² Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ Π»ΠΈ ΠΎΠ½ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с сообщСниями ΠΈΠ»ΠΈ Π±Π°ΠΉΡ‚Π°ΠΌΠΈ, ΠΊΠ°ΠΊΠΎΠ²ΠΎ количСство экзСмпляров ΠΊΠ°Π½Π°Π»Π° ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.

β€’ SetNamedPipeHandleState β€” позволяСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ состояния. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ€Π΅ΠΆΠΈΠΌΠ° (NpMode) пСрСдаСтся Π½Π΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π° ΠΏΠΎ адрСсу, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ Π½Π΅Π΄ΠΎΡ€Π°Π·ΡƒΠΌΠ΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ дСмонстрируСтся Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 11.2.

β€’ GetNamedPipeInfo β€” опрСдСляСт, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π»ΠΈ дСскриптор экзСмпляру ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΠ»ΠΈ сСрвСра, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ²

ПослС создания ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (осущСствляСмого с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateFile ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CallNamedFile, описанной Π΄Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ConnectNamedPipe, которая являСтся сСрвСрной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ лишь Π² случаС Windows NT: 

Bool ConnectNamedPipe(HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped) 

Если ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lpOverlapped установлСн Ρ€Π°Π²Π½Ρ‹ΠΌ NULL, Ρ‚ΠΎ функция ConnectNamedPipe осущСствляСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ сразу ΠΆΠ΅ послС установлСния соСдинСния с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. Π’ случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся TRUE. Если ΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° происходит Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ сСрвСром Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ CreateNamedPipe ΠΈ ConnectNamed-Pipe, Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ FALSE. Π’ этом случаС функция GetLastError Π²Π΅Ρ€Π½Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ERROR_PIPE_CONNECTED.

ПослС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ConnectNamedPipe сСрвСр ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ запросов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ReadFile ΠΈ запись ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² посрСдством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WriteFile. НаконСц, сСрвСр Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ DisconnectNamedPipe, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ дСскриптор (экзСмпляра ΠΊΠ°Π½Π°Π»Π°) для соСдинСния с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ.

ПослСдняя функция, WaitNamedPipe, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ для синхронизации соСдинСний с сСрвСром. Ѐункция осущСствляСт ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚, ΠΊΠΎΠ³Π΄Π° Π½Π° сСрвСрС имССтся Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ConnectNamedPipe, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ доступного экзСмпляра ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ WaitNamedPipe, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сСрвСр Π³ΠΎΡ‚ΠΎΠ² ΠΊ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡŽ соСдинСния, послС Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateFile. ВмСстС с Ρ‚Π΅ΠΌ, Π²Ρ‹Π·ΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateFile ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ошибкой, Ссли Π² это ΠΆΠ΅ врСмя Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ экзСмпляр ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΈΠ»ΠΈ дСскриптор экзСмпляра закрываСтся сСрвСром. ΠŸΡ€ΠΈ этом Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ сСрвСром Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ConnectNamedPipe Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WaitNamedPipe прСдусмотрСн ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» оТидания, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Ссли ΠΎΠ½ ΡƒΠΊΠ°Π·Π°Π½, отмСняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° оТидания, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ сСрвСрной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateNamedPipe.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ сСрвСров ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ²

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ сСрвСров ΠΊ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΊΠ°Π½Π°Π»Π°ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² описанном Π½ΠΈΠΆΠ΅ порядкС. Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ рассмотрим ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, выполняСмых сСрвСром, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сСрвСр создаСт соСдинСниС с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, взаимодСйствуСт с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρ‚ΠΎΡ‚ Π½Π΅ Ρ€Π°Π·ΠΎΡ€Π²Π΅Ρ‚ соСдинСниС (вынуТдая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ReadFile Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FALSE), Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС Π½Π° сторонС сСрвСра, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ соСдинСниС с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ:

/* ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ создании соСдинСния с использованиСм ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° для сСрвСра. */

hNp = CreateNamedPipe("\\\\.\\pipe\\my_pipe", …);

while (… /* Π¦ΠΈΠΊΠ» продолТаСтся Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сСрвСра.*/) {

 ConnectNamedPipe(hNp, NULL);

 while (ReadFile(hNp, Request, …) {

  …

  WriteFile(hNp, Response, …);

 }

 DisconnectNamedPipe(hNp);

}

CloseHandle(hNp);

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, выполняСмых ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹, давая Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ экзСмпляру ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Как ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ с сСрвСром Π² сСти, Ссли Π΅ΠΌΡƒ извСстно сСтСвоС имя сСрвСра (ServerName):

/* ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈ создании соСдинСния с использованиСм ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° для ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. */

WaitNamedPipe("\\\\ServerName\\pipe\\my_pipe", NMPWAIT_WAIT_FOREVER);

hNp = CreateFile("\\\\ServerName\\pipe\\my_pipe", …);

while (…/*Π¦ΠΈΠΊΠ» выполняСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ прСкратятся запросы.*/ {

 WriteFile(hNp, Request, …);

 β€¦

 ReadFile(hNp, Response);

}

CloseHandle (hNp); /* Π Π°Π·ΠΎΡ€Π²Π°Ρ‚ΡŒ соСдинСниС с сСрвСром. */

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ ΠΈ сСрвСр ΡΠΎΡΡ‚ΡΠ·Π°ΡŽΡ‚ΡΡ Π·Π° рСсурсы. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, клиСнтский Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WaitNamedPipe Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ошибкой, Ссли ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΊ этому ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρƒ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π» создан сСрвСром; для краткости тСстированиС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΡΡ‚ΠΈ выполнСния Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, доступныС Π½Π° Web-сайтС. Π”Π°Π»Π΅Π΅, Π² Ρ€Π΅Π΄ΠΊΠΈΡ… случаях Π²Ρ‹Π·ΠΎΠ² CreateFile ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π΅Ρ‰Π΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ сСрвСр Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ConnectNamedPipe. Π’ этом случаС функция ConnectNamedPipe Π²Π΅Ρ€Π½Π΅Ρ‚ сСрвСру Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FALSE, ΠΎΠ΄Π½Π°ΠΊΠΎ взаимодСйствия посрСдством ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. 

ЭкзСмпляр ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° являСтся Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌ рСсурсом, поэтому, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ€Π°Π·Ρ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС с сСрвСром, ΠΊ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ²

На рис. 11.2 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° типичная конфигурация ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

β€’ ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ экзСмпляр ΠΊΠ°Π½Π°Π»Π°, создавая Π΄ΠΎΠ»Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ соСдинСниС с сСрвСром ΠΈ занимая экзСмпляр ΠΊΠ°Π½Π°Π»Π°.

β€’ ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈ посылаСт запросы ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ получСния ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ².

β€’ Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС.

Π’ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΡƒΡŽΡΡ здСсь ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ WriteFile ΠΈ ReadFile ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΡƒΡŽ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ, ΠΈ Windows прСдоставляСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΊΠ°Π½Π°Π»ΠΎΠ² сообщСний: 

BOOL TransactNamedPipe(HANDLE hNamedPipe, LPVOID lpWriteBuf, DWORD cbWriteBuf, LPVOID lpReadBuf, DWORD cbReadBuf, LPDWORD lpcbRead, LPOVERLAPPED lpOverlapped) 

Бмысл всСх ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² здСсь Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ясСн, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ данная функция сочСтаСт Π² сСбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WriteFile ΠΈ ReadFile, примСняСмыС ΠΊ дСскриптору ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π°. Π£ΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€, Π° Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ lpcbRead прСдоставляСт Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния. ΠŸΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (Π³Π»Π°Π²Π° 14) Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… случаях функция ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π°.

Ѐункция TransactNamedPipe ΡƒΠ΄ΠΎΠ±Π½Π° Π² использовании, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рис. 11.2, ΠΎΠ½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ создания постоянного соСдинСния, Ρ‡Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ число Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ²[32].

НиТС приводится ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π²Ρ‚ΠΎΡ€ΠΎΠΉ клиСнтской Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.  

BOOL CallNamedPipe(LPCTSTR lpPipeName, LPVOID lpWriteBuf, DWORD cbWriteBuf, LPVOID lpReadBuf, DWORD cbReadBuf, LPDWORD lpcbRead, DWORD dwTimeOut) 

Ѐункция CallNamedPipe Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ образования постоянного соСдинСния; вмСсто этого ΠΎΠ½Π° создаСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ соСдинСниС, объСдиняя Π² сСбС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ:

CreateFile

WriteFile

ReadFile

CloseHandle

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠΌ Ρ‚Π°ΠΊΠΎΠ³ΠΎ способа являСтся Π»ΡƒΡ‡ΡˆΠ΅Π΅ использованиС ΠΊΠ°Π½Π°Π»Π° Π·Π° счСт сниТСния Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов систСмных рСсурсов Π½Π° ΠΎΠ΄ΠΈΠ½ запрос.

Бмысл ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΈ Π² случаС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ TransactNamedPipe, Ссли Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ вмСсто дСскриптора для указания ΠΊΠ°Π½Π°Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΅Π³ΠΎ имя. Ѐункция CallNamedPipe выполняСтся синхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅ (отсутствуСт структура OVERLAPPED). УказываСмая ΠΏΡ€ΠΈ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄Π° оТидания (dwTimeOut) (Π² миллисСкундах) относится ΠΊ соСдинСнию, Π° Π½Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ dwTimeOut ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… значСния:

β€’ NMPWAIT_NOWAIT

β€’ NMPWAIT_WAIT_FOREVER

β€’ NMPWAIT_USE_DEFAULT_WAIT, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ использованию ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Π° оТидания ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ CreateNamedPipe.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ наличия сообщСний Π² ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»Π°Ρ