Скачиваний:
14
Добавлен:
01.05.2014
Размер:
317.44 Кб
Скачать

6.4.5. Программные средства поддержки сетей

6.4.5.1. Состав программных средств поддержки сетей

В реальных ОС сетевые протоколы поддерживаются с помощью API, драйверов протоколов, а также драйверов устройств сетевых адаптеров.

Соотношение между перечисленными объектами и 7-уровневой архитектурой выглядит следующим образом.

7

Сетевое приложение

6

Библиотеки сетевых API

5

4

Драйверы протоколов TCP/IP, IPX/SPX, NetBEUI

3

2

Библиотека драйверов NDIS (network driver interface specification)

1

Сетевые адаптеры

К сетевым API относятся следующие средства:

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

  2. Именованные каналы – Named Pipes

  3. Удаленные вызовы процедур – RPC

  4. Протокол NetBIOS

  5. Сокеты – Sockets

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

Почтовые ящики обеспечивают механизм ненадежной односторонней передачи сообщений.

Почтовый ящик создается вызовом:

MsFile = CreateMailslot("\\\\.\\mailslot\\mymailslot",

0,

MAILSLOT_WAIT_FOREVER,

NULL);

Машина, на которой создан почтовый ящик, становится сервером и может только принимать сообщения.

Клиент открывает почтовый ящик вызовом:

MsFile = CreateFile("\\\\pc_name\\mailslot\\mymailslot",

GENERIC_READ|GENERIC_WRITE,

FILE_SHARE_READ|FILE_SHARE_WRITE,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL);

После открытия почтового ящика клиент может посылать сообщения с помощью вызова:

WriteFile(MsFile, S, S.GetLength(), &NumberOfBytesWritten, NULL);

Сервер может читать сообщения из почтового ящика с помощью вызова:

ReadFile(MsFile, buffer, sizeof(buffer), &NumberOfBytesRead, NULL);

Если данных нет, например, они еще не передавались, то процесс, вызвавший операцию ReadFile(), приостановит свое выполнение. Это далеко не всегда приемлемо.

Чтобы преодолеть указанный недостаток, можно пойти двумя путями:

  1. Выполнять операцию ReadFile() в отдельном потоке

  2. Использовать технологии асинхронного ввода-вывода.

Асинхронный ввод-вывод, т.е. ввод-вывод без ожидания – это целая технология, элементы которой мы рассмотрим позже на примере именованных каналов.

Применительно к Mailslot для асинхронного чтения данных может быть использована функция:

BOOL GetMailslotInfo(

HANDLE hMailslot, // mailslot handle

LPDWORD lpMaxMessageSize, // maximum message size

LPDWORD lpNextSize, // size of next message

LPDWORD lpMessageCount, // number of messages

LPDWORD lpReadTimeout // read time-out interval

);

Получив из этой функции число сообщений (должно быть больше нуля), можно вызывать функцию ReadFile() с параметром:

ReadFile(MsFile, buffer,NextSize ,&NumberOfBytesRead, NULL);

После завершения работы приложения закрывают почтовый ящик с помощью вызова:

CloseHandle(MsFile);

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

Соседние файлы в папке Материалы к курсу