Programovanie služieb vo Windows - Klient / server - 6. diel
Ukážka programu Klient - Server na báze Pipes
V predchádzajúcich článkoch, kde som ukázal ako programovať Service vo Windows 7/8, som bol zameraný na prenos pomocou IP protokolu. V tejto ukážke sa pokúsim ukázať ako sa rieši komunikácie pomocou Pipes.
Prehľad funkcií API Pipe (rúr)
Tieto funkcie nám umožňujú vykonávať komunikáciu medzi procesmi. Vo Windows je k dispozícii niekoľko funkcií Pipe a to:
- CallNamedPipe (....) - Táto funkcia sa pripája k rúre typu správy, čaká, či je dostupná inštancia rúry, zapisuje do rúry, číta z nej a potom ju uzavrie.
- ConnectNamedPipe (....) - Funkcia umožňuje procesu pomenované rúry na serveri čakať, než sa proces klienta pripojí k inštancii pomenované rúry. Proces klienta sa pripája volaním CreateFile (...) alebo CallNamedPipe (....).
- CreateNamedPipe (....) - Vytvorí inštanciu pomenované rúry a vracia Handle pre ďalšie operácie. Proces pomenované rúry na serveri používa túto funkciu k vytvoreniu prvej inštancie určité pomenované rúry a stanovuje jej základné atribúty, alebo k vytvoreniu novej inštancie už existujúce pomenované rúry.
- CreatePipe (...) - Vytvorí nepomenovanou rúru a vracia Handle pre čítanie a zápis.
- DisconnectNamedPipe (...) - odpojí stranu servera od inštancie pomenované rúry procesu klienta.
- GetNamedPipeHandleState (...) - Vyhľadá informácie o určitej pomenované rúre. Vrátené informácie sa mení podľa doby života a inštancie pomenované rúry.
- GetNamedPipeInfo (...) - Vyhľadáva informácie o špecifikované pomenované rúre.
- PeekNamedPipe (...) - Vykonáva kópiu dát z pomenované alebo nepomenované rúry do vyrovnávacej pamäte, bez toho, aby dáta z rúry odstránila. Vracia informáciu o dátach v rúre.
- SetNamedPipeHandleState (...) - Nastavuje režim čítanie a blokovanie a tiež blokovacie režim u danej pomenované rúry. Ak daný Handle prislúcha ku klientovej strane rúry a keď je proces servera na vzdialenom počítači, funkciu možno tiež použiť na riadenie lokálneho vyrovnanie.
- TransactNamedPipe (...) - Kombinuje do jednej sieťovej operácie funkcie zápisu a čítania z danej pomenované rúry.
- WaitNamedPipe (...) - Čaká, kým neuplynie interval časové oneskorenia alebo ak nie je k spojeniu dostupná inštancia pomenované rúry. To znamená, že proces rúry na serveri má v rúre čakajúce operáciu ConnectNamedPipe (...).
Komunikácia Client-Server pomocou rúr (Pipes)
Server bude vytvorený ako pomenovaná rúra pomocou prekrývajúceho I / O. Jedná sa o jednovláknovou server, ktorý využíva prekrývajúce sa operácie pre pripojenie viac klientov.
Kanál servera vytvorí pevný daný počet inštancií. Každá inštancia sa môže pripojiť k samostatnému klientovi. Ak sa klient odpojí, je jeho inštancia použitá a pripravená pre ďalšieho klienta. Uvedená ukážka je len demo, server by nemal mať viditeľné okno, mal by byť spustený vo vlastnom vlákne pracujúcim na pozadí a všetky správy smerované do prehliadača udalostí.
Pomenovaný kanál klienta používa CreateFile, tá otvára popisovač k pojmenovanému kanálu. Ak pipe kanál existuje a je prekročený počet pripojení, vracia funkcia INVALID_HANDLE_VALUE a GetLastError () vracia ERROR_PIPE_BUSY. Ak táto situácia nastane a pomenovaný kanál klient používa, potom funkcia WaitNamedPipe () čaká až inštancie pomenovaného kanálu bude k dispozícii.
Ukážka súčasného pripojenie štyroch klientov, piaty klient čaká až niektorý z klientov sa odpojí.
Server je odpojený alebo nepracuje.
Dôležité
U funkcie CreateNamedPipe (LPCTSTR lpName, ...) lpName
ukazuje na reťazec ukončený nulovým znakom, ktorý jednoznačne určuje
rúru. Môže obsahovať ľubovoľné znaky vrátane čísel a špeciálnych
znakov mimo spätného lomky. Reťazec môže byť dlhý až 255 znakov. Nie je
citlivý na malé a veľké písmená.
Musí mať tvar \\. \ Pipe \ pipename.
Použité API funkcie
- struct OVERLAPPED - Táto štruktúra je požadovaná pre asynchrónny I / O operácie. Ak je operácia otvorená s príznakom FILE_FLAG_OVERLAPPED, handle je asynchrónny, inak je handle synchrónne.
- WaitForMultipleObjects (...) je wait funkcia, ktorá končí iba vtedy, ak sú jeden alebo všetky uvedené objekty signalisované alebo dôjde k danému time-out.
- GetOverlappedResult (...) vracia výsledok prekrývajúce sa operácie na špecifikovanom súboru, rúre s menom alebo komunikačným zariadením.
- CreateEvent (...) vytvorí objekt udalosťou, ktorá môže byť programovo nastavená do signalisovaného alebo nesignalisovaného stave.
V ukážke sú zdrojové texty vytvorené vo Visual Studiu 2013.
Dúfam, že sa bude ukážka páčiť.
Galéria
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 97x (827.6 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#