
- •Программирование в локальных сетях с использованием почтовых слотов
- •1 Почтовые слоты
- •1.1 Имена почтовых ящиков
- •1.2 Размеры сообщений
- •1.3 Общие сведения об архитектуре клиент-сервер
- •1.4 Сервер почтовых ящиков
- •1.5 Клиент почтовых ящиков
- •1.6 Дополнительные api-функции почтовых ящиков
- •1.7 Неспособность отменить блокирующие запросы ввода-вывода
- •1.8 Утечки памяти
- •2 Задания на выполнение лабораторной работы.
- •3 Контрольные вопросы
1.6 Дополнительные api-функции почтовых ящиков
Сервер почтового ящика может использовать две дополнительные API-функции для взаимодействия с почтовым ящиком: GetMailslotInfo и SetMailslotInfo. Функция GetMailslotInfo возвращает размер сообщения, когда оно прибывает в почтовый ящик. Приложения используют эту возможность, чтобы динамически настраивать свои буферы для входящих сообщений изменяющейся длины. GetMailslotInfo может также применяться для опроса наличия входящих данных:
BOOL GetMailslotInfo(
HANDLE hMailslot,
LPDWORD lpMaxMessageSize,
LPDWORD lpNextSize,
LPDWORD lpMessageCount,
LPDWORD lpReadTimeout
);
Параметр hMailslot указывает почтовый ящик, возвращенный вызовом API-функции CreateMailslot.
Параметр lpMaxMessageSize задает, сообщение какого размера (в байтах) можно записать в почтовый ящик.
Параметр 1рNextSize указывает на размер следующего сообщения (в байтах).
Параметр GetMailslotInfo может вернуть значение MAILSLOT _NO_MESSAGE, указывая, что в настоящий момент почтовый ящик не ждет никакого сообщения. Потенциально сервер вправе использовать этот параметр для проверки наличия входящих данных, не давая приложению блокировать ввод-вывод при вызове функции ReadFile. Но делать это не рекомендуется: приложение будет непрерывно использовать центральный процессор для проверки входящих данных, даже если не обрабатываются никакие сообщения, что уменьшит производительность.
Для предотвращения блокировки при вызове функции ReadFile, используйте перекрытый ввод-вывод Win32. Параметр lpMessageCount задает буфер, куда записывается общее количество сообщений, ожидающих прочтения. Этот параметр также задействуют для проверки наличия данных. Параметр lpReadTimeout указывает на буфер, возвращающий время тайм-аута (в миллисекундах), в течение которого операция чтения ждет записи сообщения в почтовый ящик.
API-функция SetMailslotInfo задает значение тайм-аута для почтового ящика, в течение которого операция чтения ожидает входящих сообщений. Таким образом, приложение может изменить способ чтения от блокирующего к неблокирующему или наоборот. Параметр SetMailslotInfo определен следующим образом:
BOOL SetMallslotInfo(
HANDLE hMailslot,
DWORD lReadTlmeout
);
Параметр hMailslot указывает почтовый ящик, возвращаемый вызовом API-функции CreateMailsot. Параметр lReadTimeout определяет количество времени (в миллисекундах), в течение которого операция чтения ожидает записи сообщения в почтовый ящик. Если оно равно 0, то в отсутствие сообщений операции чтения возвращаются немедленно, если MAILSLOT_WAIT_FOREVER - будут ждать бесконечно долго.
1.7 Неспособность отменить блокирующие запросы ввода-вывода
Эта проблема существует в Windows 95 и Windows 98. Серверы почтовых ящиков для получения данных вызывают функцию ReadFile. Если почтовый ящик создается с флагом MAILSLOT_WAIT_FOREVER, запросы блокируются на определенное время, пока данные не станут доступны. При невыполненном запросе функции ReadFile серверное приложение при завершении зависает. Единственный способ снять приложение - перезагрузить Windows. Для решения этой проблемы заставьте сервер открыть описатель его почтового ящика в отдельном потоке и отправить данные, чтобы прервать блокирующий запрос чтения.