Създаване на именувани канали
Тема: Наименувана тръбна комуникация със сървър.
Работа с именувани канали.
Работата с наименувани канали, точно както работата с анонимни канали, изисква споделяне на редица функции. Затова първо се разглеждат всички функции, които са проектирани да работят с именувани канали, а след това се дават някои примери, които илюстрират използването на тези функции.
Създаване на именувани канали.
Наименуваните канали се създават от сървърния процес с помощта на функциятаCreateNamedPipe, която има следния прототип:
LPCTSTR lpName, // име на канал
DWORD dwOpenMode, // атрибути на канала
DWORD dwPipeMode, // режим на пренос на данни
DWORD nMaxInstances, // максимален брой екземпляри на канала
DWORD nOutBufferSize, // размер на изходния буфер
DWORD nInBufferSize, // размер на входния буфер
DWORD nDefaultTimeOut, // изчакване на клиентската комуникация
LPSECURITY_ATTRIBUTES lpPipeAttributes // атрибути за сигурност
където параметрите имат следните значения.
Параметърът lpName сочи към низ, който трябва да изглежда така:
Тук точката (.) обозначава локалната машина, тъй като на локалната машина винаги се създава нова именувана тръба, думата тръба е фиксирана и
обозначава име на канал, което е дефинирано от потребителя и не е чувствително към главни и малки букви.
Параметърът dwOpenMode определя флагове, които контролират посоката на трансфер на данни, буфериране, синхронизиране на обмена на данни и права за достъп до наименования канал. Флаговете се използват за определяне на посоката на трансфер на данни:
- PIPE_ACCESS_DUPLEX четене и запис в канал,
- PIPE_ACCESS_INBOUND клиент пише исървърът чете данните,
- PIPE_ACCESS_OUTBOUND сървърът записва и клиентът чете данни.
Флагът, който указва посоката на прехвърляне на данни през наименована тръба, трябва да съвпада за всички екземпляри на една и съща наименувана тръба. Флаговете се използват за определяне на метода за буфериране и синхронизация:
- FILE_FLAG_WRITE_THROUGH деактивира буферирането при прехвърляне на данни по мрежата.
- FILE_FLAG_OVERLAPPED Разрешава асинхронен трансфер на данни по канала.
Тези флагове могат да бъдат различни за всеки екземпляр на канал с едно и също име. Флаговете за дефиниране на атрибути за сигурност ще бъдат обсъдени по-късно.
Параметърът dwPipeMode указва флаговете, как данните се прехвърлят по именуван канал. Следните флагове се използват, за да се определи как да се четат и записват данни в наименована тръба:
- PIPE_TYPE_BYTE запис на данни чрез поток,
- PIPE_TYPE_MESSAGE записва данни чрез съобщения.
- PYPE_READMODE_BYTE чете данни чрез поток,
- PYPE_READMODE_MESSAGE чете данни по съобщения.
По подразбиране наименуваните данни за канала се предават поточно. Флаговете на метода за четене и запис на именувана тръба трябва да бъдат еднакви за всички екземпляри на една и съща наименувана тръба. Следните флагове се използват за определяне на времето за достъп до наименована тръба:
- PIPE_WAIT синхронна комуникация с тръбата и обмен на данни по тръбата,
- PIPE_NOWAIT Асинхронна комуникация с канала и обмен на данни през канала.
Тези флагове могат да бъдат различни за всеки екземпляр на именувана тръба.
Параметърът nMaxInstances указва максималния брой на именувани екземпляри на канала, който може да варира от 1 до PIPE_UNLIMITED_INSTANCES.
Параметрите nOutBufferSize и nInBufferSize дефиниратсъответно размерите на изходните и входните буфери за обмен на данни през наименуван канал. Тези стойности обаче се разглеждат от операционните системи Windows само като желания на потребителя и изборът на размер на буфера е оставен на операционната система.
Параметърът nDefaultTimeOut задава колко дълго клиентът ще чака да комуникира със сървъра, ако клиентът извика функцията WaitNamedPipe, която задава интервала на изчакване по подразбиране.
При успех функцията CreateNamedPipe връща стойност на дескриптор на наименована тръба; при неуспех една от двете стойности:
- INVALID_HANDLE_VALUE неуспешно завършване,
- ERROR_INVALID_PARAMETR Стойността на параметъра nMaxInstances е по-голяма от стойността на PIPE_UNLIMITED_INSTANCES.
За да комуникира сървър с множество клиенти по една и съща наименувана тръба, сървърът трябва да създаде множество екземпляри на тази тръба. Всеки екземпляр на именувана тръба се създава чрез извикване на функцията CreateNamedPipe, в която определени флагове трябва да бъдат зададени еднакви за всички екземпляри на една и съща именувана тръба. Всяко ново извикване на тази функция връща нов манипулатор към създадения екземпляр на наименуваната тръба.
Не намерихте това, което търсихте? Използвайте търсачката:
Деактивирайте adBlock! и обновете страницата (F5)наистина е необходимо