Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
Функция MsgReceive (при использовании в сети) тоже оказывается под влиянием. На момент разблокирования функции MsgReceive на стороне сервера
В структуре
msglen | Указывает
qnet любит передавать по 8Кб за один раз). |
srcmsglen | Указывает на количество данных, которое клиент хотел передать (определяется клиентом). |
Таким образом, если бы клиент желал передать 1 мегабайт данных по сети, MsgReceive сервера разблокировалась бы, установив параметр msglen в значение 8192 (указывая, что 8192 байта доступны в буфере); параметр srcmsglen при этом равнялся бы 1048576 (указывая, что клиент пытался переслать 1 мегабайт данных).
Затем сервер использует MsgRead для получения остальной части данных из адресного пространства клиента.
Несколько замечаний о дескрипторах узлов
Еще одна любопытная вещь, которой мы еще не касались в обсуждениях обмена сообщениями, — это дескрипторы узлов, для краткости обозначаемые «ND» (сокр. от Node Descriptor — прим. ред.).
Вспомните: в наших примерах мы использовали символьные имена узлов, например,
При работе в QNX/Neutrino все узлы внутренне представляются 32-разрядными числами, но эти числа не являются уникальными в сети! Я имею в виду, что узел
Узел | wintermute | spud | foobar |
---|---|---|---|
wintermute | 0 | 7 | 4 |
spud | 4 | 0 | 6 |
foobar | 5 | 7 | 0 |
Обратите внимание, что каждый узел считает свой собственный дескриптор нулевым. Также отметьте, что для узла
К счастью, вам не надо беспокоиться о дескрипторах узлов по ряду причин:
• Большинство осуществляемых вами операций обмена сообщениями «с внешним миром» будут реализовываться с помощью вызовов функций высокого уровня (таких как функция open, приведенная в примере выше).
• Дескрипторы узлов не кэшируются — предполагается, что получив дескриптор, вы используете немедленно и забудете про него.
• Существует ряд библиотечных функций, предназначенных для преобразования имени пути (например,
Чтобы работать с дескрипторами узлов, вам понадобится подключить файл
Для преобразования строки в дескриптор узла используется функция netmgr_strtond. После получения дескриптора узла его следует сразу же применить в вызове функции ConnectAttach. Не пытайтесь сохранять его какой-либо структуре данных! Веским основанием для этого является то, что администратор сети может решить повторно использовать дескриптор после отключения всех соединений с узлом.
Так что если вы получили дескриптор «7» для узла
Поскольку дескрипторы узлов в сети не уникальны, возникает вопрос: «А как передавать эти штуки по сети?» Очевидно, взгляды узла
• Не передавать по сети дескрипторы узлов и пользоваться символьными именами (например,
• Применять функцию netmgr_remote_nd.
Первый метод хорош как универсальное решение. Второй метод достаточно удобен на практике.
Эта функция принимает два параметра, где remote_nd — дескриптор узла целевой машины, a local_nd — дескриптор узла, который нужно преобразовать из точки зрения локальной машины в точку зрения целевой. Результатом является дескриптор узла, корректный с точки зрения заданной удаленной машины.
Например, пусть