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.
- ConnectNamedPipe(....) - 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(....).
- CreateNamedPipe(....) - 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.
- DisconnectNamedPipe(...) - Odpojí stranu serveru od instance pojmenované roury procesu klienta.
- GetNamedPipeHandleState(...) - Vyhledá informace o určité pojmenované rouře. Vrácené informace se mění podle doby života a instance pojmenované roury.
- GetNamedPipeInfo(...) - 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.
- SetNamedPipeHandleState(...) - 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í.
- TransactNamedPipe(...) - 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 ConnectNamedPipe(...).
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_VALUE 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í.

Server je odpojen nebo nepracuje .

Důležité
U funkce CreateNamedPipe(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\pipename.
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_OVERLAPPED, handle je asynchronní, jinak je handle synchronní.
- WaitForMultipleObjects(...) je wait funkce, která končí pouze tehdy, jsou-li jeden nebo všechny uvedené objekty signalisované nebo dojde k danému time-out.
- GetOverlappedResult(...) 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
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 101x (827.6 kB)
Aplikace je včetně zdrojových kódů v jazyce C#