- •6.4. Внешние коммуникации
- •6.4.1. Протоколы тср/ip
- •6.4.1.1. Определение и достоинства протокола tcp/ip
- •6.4.1.2. Архитектура tcp/ip
- •6.4.1.3. Соответствие между моделями tcp/ip и iso osi
- •6.4.2. Протокол ip
- •6.4.2.1. Структура заголовка ip-пакета
- •Ip-датаграмма
- •6.4.2.2. Ip-адресация
- •190.50.1.1
- •190.50.1.2
- •190.50.2.1
- •190.50.2.2
- •6.4.3. Протокол udp
- •6.4.4. Протокол tcp
- •6.4.4.1. Структура tcp-сегмента
- •6.4.4.2. Этапы tcp-сеанса
- •6.4.5. Программные средства поддержки сетей
- •6.4.5.1. Состав программных средств поддержки сетей
- •1. Почтовые ящики
- •2. Именованные каналы
- •3. Удаленные вызовы процедур
- •4. Протокол NetBios
- •6.4.5.2. Программные средства работы с сокетами
- •6.4.6. Сетевое программное обеспечение уровня приложений
- •6.4.6.1. Протокол ftp
- •6.4.6.2. Протокол smtp
- •Заключение
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 относятся следующие средства:
Почтовые ящики – MailSlots
Именованные каналы – Named Pipes
Удаленные вызовы процедур – RPC
Протокол NetBIOS
Сокеты – 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(), приостановит свое выполнение. Это далеко не всегда приемлемо.
Чтобы преодолеть указанный недостаток, можно пойти двумя путями:
Выполнять операцию ReadFile() в отдельном потоке
Использовать технологии асинхронного ввода-вывода.
Асинхронный ввод-вывод, т.е. ввод-вывод без ожидания – это целая технология, элементы которой мы рассмотрим позже на примере именованных каналов.
Применительно к 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);
Здесь приведены только основные вызовы для работы с почтовым ящиком. В реально действующих приложениях все несколько сложнее.