Когда сервер вызывает функцию qnet
, возлагая на него ответственность за доставку этой «заготовки» удаленному qnet
, который уже доставит реальное событие клиенту. Так вот, на стороне сервера с этим вызовом могут возникнуть проблемы, потому что он не является блокирующим. Это означает, после вызова
Чтобы уберечь функции
Функция qnet
может еще не успеть передать все данные клиента. Это делается из соображений производительности.
В структуре struct _msg_infо
, передаваемой функции
Указывает на фактическое количество данных, переданное функцией qnet любит передавать по 8Кб за один раз). | |
Указывает на количество данных, которое клиент хотел передать (определяется клиентом). |
Таким образом, если бы клиент желал передать 1 мегабайт данных по сети,
Затем сервер использует
Несколько замечаний о дескрипторах узлов
Еще одна любопытная вещь, которой мы еще не касались в обсуждениях обмена сообщениями, — это дескрипторы узлов, для краткости обозначаемые «ND» (сокр. от Node Descriptor —
Вспомните: в наших примерах мы использовали символьные имена узлов, например, /net/wintermute
. В QNX4 (предыдущая версия QNX до появления QNX/Neutrino) вся работа в сети была основана на концепции идентификатора узла, небольшого целого числа, уникально определяющего узел сети. Таким образом, в терминах QNX4 мы говорили бы что-то вроде «узел 61», или «узел 1», и это отражалось бы и на вызовах функций тоже.
При работе в QNX/Neutrino все узлы внутренне представляются 32-разрядными числами, но эти числа не являются уникальными в сети! Я имею в виду, что узел wintermute
может думать об узле spud
как об узле с дескриптором 7, в то время как сам узел spud
может думать, что дескриптор 7 соответствует узлу magenta
. Поясню подробнее, чтобы дать полную картину происходящего. В приведенной ниже таблице сведены примерные дескрипторы узлов, которые могли бы использоваться для описания трех узлов: wintermute
, spud
и foobar
(не путать с аббревиатурой FUBAR —
Узел | wintermute | spud | foobar |
---|---|---|---|
wintermute | 0 | 7 | 4 |
spud | 4 | 0 | 6 |
foobar | 5 | 7 | 0 |
Обратите внимание, что каждый узел считает свой собственный дескриптор нулевым. Также отметьте, что для узла spud
оба узла wintermute
и foobar
имеют дескриптор 7. Однако, для узла foobar
узел wintermute
имеет дескриптор 4, а узел spud
— 6. Как я и упоминал раньше, эти номера не уникальны в сети, но они уникальны на каждом узле. Вы можете относиться к ним, как к файловым дескрипторам — два процесса, когда обращаются к одному и тому же файлу, могут иметь для него как одинаковый дескриптор, так и нет — все зависит от того, кто, когда и который файл открывает.
К счастью, вам не надо беспокоиться о дескрипторах узлов по ряду причин: