рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

PipeИмяКанала

PipeИмяКанала - раздел Образование, Обмен информацией между процессами с помощью каналов и почтовых ящиков В Любом Случае Процесс Может Создать Канал Только На Той Рабочей Станции, Где...

В любом случае процесс может создать канал только на той рабочей станции, где он запущен, поэтому при создании канала имя сервера никогда не указывается.

Создание канала.

Для создания именованных и анонимных каналов Pipes используются функции CreatePipe и CreateNamedPipe.

Установка соединения с каналом со стороны сервера.

После того как серверный процесс создал канал, он может перейти в режим соединения с клиентским процессом. Соединение со стороны сервера выполняется с помощью функции ConnectNamedPipe.

Установка соединения с каналом со стороны клиента.

Для создания канала клиентский процесс может воспользоваться функцией CreateFile.

Отключение серверного процесса от клиентского процесса.

Установив канал с клиентским процессом при помощи функции ConnectNamedPipe, серверный процесс может затем разорвать канал, вызвав для этого функцию DisconnectNamedPipe.

Закрытие идентификатора канала.

Если канал больше не нужен, после отключения от клиентского процесса серверный и клиентский процессы должны закрыть его идентификатор функцией CloseHandle.

Запись и чтение данных в канале.

Запись и чтение данных в открытом канале выполняется с помощью функциий WriteFile и ReadFile, аналогично записи и чтению в обычном файле.

 

Пример. Передача данных (синхронная) от программы-клиента программе-серверу с помощью именованного канала на одной рабочей станции.

 

Программа-сервер

 

#include <windows.h>

#include <stdio.h>

#include <conio.h>

BOOL fConnected; // Флаг успешного создания канала

HANDLE hNamedPipe; // Идентификатор канала Pipe

LPSTR lpszPipeName = "\\.\pipe\$MyFirstPipe"; // Имя создаваемого канала

char szBuf[512]; // Буфер для приема данных из канала

DWORD cbRead; // Количество байт данных, принятых через канал

 

int main()

{

// Создаем канал Pipe с именем lpszPipeName

hNamedPipe = CreateNamedPipe(

lpszPipeName, PIPE_ACCESS_DUPLEX,

PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,

PIPE_UNLIMITED_INSTANCES, 512, 512, 5000, NULL);

// Если возникла ошибка, завершаем работу приложения

if(hNamedPipe == INVALID_HANDLE_VALUE)

{

printf("Error Pipe Creating!!!n");

getch();

return 0;

}

// Ожидаем соединения со стороны клиента

fConnected = ConnectNamedPipe(hNamedPipe, NULL);

// Если возникла ошибка, завершаем работу приложения

if(!fConnected)

{

printf("Error Pipe Connecting!!!n");

CloseHandle(hNamedPipe);

getch();

return 0;

}

// Получение данных из канала

if(ReadFile(hNamedPipe, szBuf, 512, &cbRead, NULL))

printf("Received %d bytes: <%s>n", cbRead, szBuf);

else printf("Error Data Transfer!!!n");

CloseHandle(hNamedPipe);

getch();

return 0;

}

 

Программа-клиент

 

#include <windows.h>

#include <stdio.h>

#include <conio.h>

HANDLE hNamedPipe; // Идентификатор канала Pipe

DWORD cbWritten; // Количество байт, переданных через канал

char szBuf[256]; // Буфер для передачи данных

LPSTR lpszPipeName = "\\.\pipe\$MyFirstPipe"; // Имя создаваемого канала

 

int main()

{

// Установка соединения с процессом PIPES

hNamedPipe = CreateFile(lpszPipeName, GENERIC_READ | GENERIC_WRITE,

0, NULL, OPEN_EXISTING, 0, NULL);

// Если возникла ошибка, завершаем работу приложения

if(hNamedPipe == INVALID_HANDLE_VALUE)

{

printf("Error Pipe Creating!!!n");

getch();

return 0;

}

// Передача данных серверному процессу

strcpy(szBuf,"Test Pipe Connection");

if(!WriteFile(hNamedPipe, szBuf, strlen(szBuf) + 1, &cbWritten, NULL))

// Если произошла ошибка, выдаем сообщение

printf("Error Data Transfer!!!n");

else printf("Transferred %d bytes: <%s>n", cbWritten, szBuf);

// Закрываем идентификатор канала

CloseHandle(hNamedPipe);

getch();

return 0;

}

 

Почтовые ящики.

Почтовые ящики позволяют выполнять одностороннюю передачу данных от одного или нескольких клиентов к одному или нескольким серверам. Главная особенность почтовых ящиков заключается в том, что они, в отличие от каналов позволяют передавать данные в широковещательном режиме.

Это означает, что на компьютере или в сети могут работать несколько серверных процессов, способных получать сообщения через почтовые ящики. При этом один клиентский процесс может посылать сообщения сразу всем этим серверным процессам.

Создание почтового ящика

Mailslot создается серверным процессом с помощью специально предназначенной для этого функции CreateMailslot. После создания серверный процесс получает идентификатор Mailslot. Пользуясь этим идентификатором, сервер может читать сообщения, посылаемые в почтовый ящик клиентскими процессами. Однако сервер не может выполнять над Mailslot операцию записи, так как этот почтовый ящик предназначен только для односторонней передачи данных – от клиента к серверу.

Имя Mailslot задается аналогично имени канала Pipe (приведен синтаксис для создания почтового ящика на своей рабочей станции):

– Конец работы –

Эта тема принадлежит разделу:

Обмен информацией между процессами с помощью каналов и почтовых ящиков

Обмен информацией между процессами с помощью каналов и почтовых ящиков... Цель работы изучить возможности применения механизма обмена данными между процессами в операционной системе Windows...

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: PipeИмяКанала

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

Теоретические сведения
  Каналы. Через канал можно передавать данные только между двумя процессами. Один из процессов создает канал, другой открывает его. После этого оба процесса могут пере

Mailslot[Путь]ИмяПочтовогоЯщика
В последних двух случаях размер сообщений ограничивается 400 байтами. Запись и чтение данных в почтовых ящиках осуществляется аналогично записи и чтению в каналах. Определение

Порядок выполнения работы
  1. Ознакомиться с постановкой задачи и исходными данными. В соответствии с номером по журналу определить вариант задачи. 2. Согласно рекомендациям, приведенным в исходных д

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги