Programování služeb ve Windows - Klient/server - 6. díl

C# .NET Pro pokročilé Programování služeb ve Windows - Klient/server - 6. díl

Ukázka programu Klient - Server na bázi Pipes

V předchozích článcích, kde jsem ukázal jak programovat Service ve Windows 7/8, jsem byl zaměřen na přenos pomocí IP protokolu. V této ukázce se pokusím ukázat jak se řeší komunikace pomocí Pipes.

Přehled funkcí API Pipe (rour)

Tyto funkce nám umožňují provádět komunikaci mezi procesy. Ve Windows je k dispozici několik funkcí Pipe a to:

  • CallNamedPipe(­....) - Tato funkce se připojuje k rouře typu zprávy, čeká, zda je dostupná instance roury, zapisuje do roury, čte z ní a pak ji uzavře.
  • ConnectNamedPi­pe(....) - Funkce umožňuje procesu pojmenované roury na serveru čekat, než se proces klienta připojí k instanci pojmenované roury. Proces klienta se připojuje voláním CreateFile(...) nebo CallNamedPipe(­....).
  • CreateNamedPi­pe(....) - Vytvoří instanci pojmenované roury a vrací Handle pro další operace. Proces pojmenované roury na serveru používá tuto funkci k vytvoření první instance určité pojmenované roury a stanoví jí základní atributy, nebo k vytvoření nové instance již existující pojmenované roury.
  • CreatePipe(...) - Vytvoří nepojmenovanou rouru a vrací Handle pro čtení a zápis.
  • DisconnectNamed­Pipe(...) - Odpojí stranu serveru od instance pojmenované roury procesu klienta.
  • GetNamedPipeHan­dleState(...) - Vyhledá informace o určité pojmenované rouře. Vrácené informace se mění podle doby života a instance pojmenované roury.
  • GetNamedPipeIn­fo(...) - Vyhledává informace o specifikované pojmenované rouře.
  • PeekNamedPipe(­...) - Provádí kopii dat z pojmenované nebo nepojmenované roury do vyrovnávací paměti, aniž by data z roury odstranila. Vrací informaci o datech v rouře.
  • SetNamedPipeHan­dleState(...) - Nastavuje režim čtení a blokování a také blokovací režim u dané pojmenované roury. Jestliže daný Handle přísluší ke klientově straně roury a když je proces serveru na vzdáleném počítači, funkci lze rovněž použít k řízení lokálního vyrovnání.
  • TransactNamed­Pipe(...) - Kombinuje do jedné síťové operace funkce zápisu a čtení z dané pojmenované roury.
  • WaitNamedPipe(­...) - Čeká, dokud neuplyne interval časové prodlevy nebo pokud není ke spojení dostupná daná instance pojmenované roury. To znamená, že proces roury na serveru má v rouře čekající operaci ConnectNamedPi­pe(...).

Komunikace Client-Server pomocí rour (Pipes)

Server bude vytvořen jako pojmenovaná roura pomocí překrývajícího I/O . Jedná se o jednovláknový server, který využívá překrývající se operace pro připojení více klientů.

Kanál serveru vytvoří pevný daný počet instancí. Každá instance se může připojit k samostatnému klientovi. Pokud se klient odpojí, je jeho instance použita a připravena pro dalšího klienta. Uvedená ukázka je pouze demo, server by neměl mít viditelné okno, měl by být spuštěný ve vlastním vlákně pracujícím na pozadí a veškeré zprávy směřovány do prohlížeče událostí.

Pojmenovaný kanál klienta používá CreateFile, ta otvírá popisovač k pojmenovanému kanálu. Pokud pipe kanál existuje a je překročen počet připojení, vrací funkce INVALID_HANDLE_VA­LUE a GetLastError() vrací ERROR_PIPE_BUSY. Pokud tato situace nastane a pojmenovaný kanál klient používá, pak funkce WaitNamedPipe() čeká až instance pojmenovaného kanálu bude k dispozici.

Ukázka současného připojení čtyř klientů, pátý klient čeká až některý z klientů se odpojí.

Klient Server připojení

Server je odpojen nebo nepracuje .

Nepracuje server

Důležité

U funkce CreateNamedPi­pe(LPCTSTR lpName ,...) lpName ukazuje na řetězec ukončený nulovým znakem, který jednoznačně určuje rouru. Může obsahovat libovolné znaky včetně čísel a speciálních znaků mimo zpětného lomítka. Řetězec může být dlouhý až 255 znaků. Není citlivý na malá a velká písmena.
Musí mít tvar \\.\pipe\pipe­name.

Použité API funkce

  • struct OVERLAPPED - Tato struktura je požadována pro asynchronní I/O operace. Pokud je operace otevřena s příznakem FILE_FLAG_OVER­LAPPED, handle je asynchronní, jinak je handle synchronní.
  • WaitForMultiple­Objects(...) je wait funkce, která končí pouze tehdy, jsou-li jeden nebo všechny uvedené objekty signalisované nebo dojde k danému time-out.
  • GetOverlapped­Result(...) vrací výsledek překrývající se operace na specifikovaném souboru, rouře se jménem nebo komunikačním zařízením.
  • CreateEvent(...) vytvoří objekt událostí, která může být programově nastavena do signalisovaného nebo nesignalisovaného stavu.

V ukázce jsou zdrojové texty vytvořené ve Visual Studiu 2013.

Doufám, že se bude ukázka líbit.


Galerie

Program byl vytvořen v roce 2014.

 

Stáhnout

Staženo 75x (827.6 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Program pro vás napsal zpavlu
Avatar
C# a C++

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
C# - Pro pokročilé

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!