IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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í - Programování služeb ve Windows

Server je odpojen nebo nepracuje .

Nepracuje server - Programování služeb ve Windows

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žením následujícího souboru souhlasíš s licenčními podmínkami

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

 

Všechny články v sekci
Programování služeb ve Windows
Program pro vás napsal zpavlu
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
C# , C++ a assembler
Aktivity