Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE 2
Межпроцессное взаимодействие
Почтовые ящики обеспечивают только однонаправленные соединения. Каждый процесс, который создает почтовый ящик, является «сервером почтовых ящиков» (mailslot server). Другие процессы, называемые «клиентами почтовых ящиков» (mailslot clients), посылают сообщения серверу, записывая их в почтовый ящик. Входящие сообщения всегда дописываются в почтовый ящик и сохраняются до тех пор, пока сервер их не прочтет. Каждый процесс может одновременно быть и сервером и клиентом почтовых ящиков, создавая, таким образом, двунаправленные коммуникации между процессами.
Mailslot является псевдофайлом находящимся в памяти и вы должны использовать стандартные функции для работы с файлами, чтобы получить доступ к нему. Данные в почтовом ящике могут быть в любой форме их интерпретацией занимается прикладная программа, но их общий объем не должен превышать 64 Кб. Однако, в отличии от дисковых файлов, mailslotы являются временными когда все дескрипторы почтового ящика закрыты, он и все его данные удаляются. Заметим, что все почтовые ящики являются локальными по отношению к создавшему их процессу; процесс не может создать удаленный mailslot.
Когда процесс создает почтовый ящик, имя последнего должно иметь следующую форму:
\\.\mailslot\[path]name
Если вы хотите отправить сообщение в почтовый ящик на удаленный компьютер, то воспользуйтесь NETBIOS-именем:
\\ComputerName\mailslot\[path]name
Клиенты и серверы, использующие почтовые ящики, при работе с ними должны пользоваться следующими функциями:
Функции серверов почтовых ящиков
Функция |
Описание |
CreateMailslot |
Создает почтовый ящик и возвращает его дескриптор. |
GetMailslotInfo |
Извлекает максимальный размер сообщения, размер почтового ящика, размер следующего сообщения в ящике, количество сообщений и время ожидания сообщения при выполнении операции чтения. |
SetMailslotInfo |
Изменение таймаута при чтении из почтового ящика. |
Функции клиентов почтовых ящиков
Функция |
Описание |
CloseHandle |
Закрывает дескриптор почтового ящика для клиентского процесса. |
CreateFile |
Создает дескриптор почтового ящика для клиентского процесса. |
DuplicateHandle |
Дублирование дескриптора почтового ящика. |
WriteFile, WriteFileEx |
Запись сообщений в почтовый ящик. |
Рассмотрим последовательно все операции, необходимые для корректной работы с почтовыми ящиками.
1. Создание почтового ящика.
Эта операция выполняется процессом сервера с использованием функции CreateMailslot.
2. Запись сообщений в почтовый ящик.
Запись в mailslot производится аналогично записи в стандартный дисковый файл. Следующий код иллюстрирует как с помощью функций CreateFile, WriteFile и CloseHandle можно поместить сообщение в почтовый ящик.
3. Чтение сообщений из почтового ящика.
Создавший почтовый ящик процесс получает право считывания сообщений из него используя дескриптор mailslotа в вызове функции ReadFile. Следующий пример использует функцию GetMailslotInfo чтобы определить сколько сообщений находится в почтовом ящике. Если есть непрочитанные сообщения, то они отображаются в окне сообщения вместе с количеством оставшихся сообщений.
Существует два способа организовать двунаправленное соединение с помощью каналов: безымянные и именованные каналы.
Безымянные (или анонимные) каналы позволяют связанным процессам передавать информацию друг другу. Чтобы производить обмен данными в обоих направлениях, вы должны создать два безымянных канала. Безымянные каналы не могут быть использованы для передачи данных по сети и для обмена между несвязанными процессами.
Именованные каналы используются для передачи данных между независимыми процессами или между процессами, работающими на разных компьютерах. Процесс клиента именованных каналов, зная имя созданного канала, открывает его на своей стороне с учетом ограничений, указанных процессом сервера. После этого между сервером и клиентом создается соединение, по которому может производиться обмен данными в обоих направлениях.
При создании и получении доступа к существующему каналу необходимо придерживаться следующего стандарта имен каналов:
\\.\pipe\pipename
Если канал находится на удаленном компьютере, то вам потребуется NETBIOS-имя компьютера:
\\ComputerName\pipe\pipename