Особенности обмена сообщениями в сети

Особенности обмена сообщениями в сети

Итак, как только соединение установлено, все дальнейшие операции обмена сообщениями осуществляются в соответствии с этапом 4, как указано на рисунке. Это может привести вас к ошибочному представлению, что передача сообщений по сети идентична локальной. К сожалению, это не так. Вот список отличий:

• более длительные задержки;

• функция ConnectAttach() возвращает признак успешного соединения независимо от того, является ли узел доступным или нет — реальный признак ошибки проявляется только при первой попытке передать сообщение;

• функция MsgDeliverEvent() не обеспечивает достаточной надежности;

• функции MsgReply(), MsgRead(), MsgWrite() являются блокирующими вызовами (в локальном варианте они не являлись таковыми);

• функция MsgReceive() не будет принимать все данные, посланные клиентом; сервер будет должен вызывать функцию MsgRead() для получения окончательных остальных данных.

Более длительные времена задержки

Поскольку передача сообщений теперь выполняется в некоторой среде, а не прямым копированием «память-память» под управлением ядра, можно смело ожидать, что затраты времени на передачу сообщения будут существенно выше (100-Мбитный Ethernet в сравнении с 128-битным динамическим ОЗУ с тактированием 100 МГц будет ориентировочно на один или два порядка медленнее). В дополнение к этому также будут сказываться накладные расходы протокола и повторные попытки передачи в сбойных сетях.

Воздействие на функцию ConnectAttach()

Когда вы вызываете функцию ConnectAttach(), вы задаете ей идентификаторы ND, PID и CHID. Все, что при этом происходит в QNX/Neutrino, заключается в возврате ядром идентификатора соединения драйверному потоку qnet, изображенному выше на рисунке. Поскольку никакого сообщения еще не отправлено, вы не имеете информации о том, доступен ли узел, к которому вы только что подсоединились, или нет. В обычном случае это не проблема, потому что большинство клиентов не будет самостоятельно вызывать ConnectAttach() и скорее воспользуется библиотечной функцией open(), которая перед передачей сообщения «open» сама вызывает ConnectAttach(). Это практически немедленно дает информацию о доступности удаленного узла.

Воздействие на функцию MsgDeliverEvent()

Когда сервер вызывает функцию MsgDeliverEvent() локально, ответственность за доставку события целевому потоку ложится на ядро. В сетевом варианте сервер также может вызывать функцию MsgDeliverEvent(), но на этот раз ядро доставит «заготовку» этого события администратору qnet, возлагая на него ответственность за доставку этой «заготовки» удаленному qnet, который уже доставит реальное событие клиенту. Так вот, на стороне сервера с этим вызовом могут возникнуть проблемы, потому что он не является блокирующим. Это означает, после вызова MsgDeliverEvent() сервер продолжает выполняться, и поздно уже оглядываться и говорить «Знаете, очень не хочется вас огорчать, но помните тот вызов MsgDeliverEvent()? Так вот, он не сработал...»

Воздействие на функции MsgReply(), MsgRead() и MsgWrite()

Чтобы уберечь функции MsgReply(), MsgRead() и MsgWrite() от вышеупомянутой проблемы MsgDeliverEvent(), эти функции при использовании их в сети преобразуются в блокирующие вызовы. В локальном случае они бы просто передали данные и разблокировались; в сети же мы должны либо удостовериться, что данные были доставлены клиенту (в случае MsgReply()), либо собственно передать данные по сети клиенту или от него (в случае двух других функций).

Воздействие на функцию MsgReceive()

Функция MsgReceive() (при использовании в сети) тоже оказывается под влиянием. На момент разблокирования функции MsgReceive() на стороне сервера qnet может еще не успеть передать все данные клиента. Это делается из соображений производительности.

В структуре struct _msg_infо, передаваемой функции MsgReceive() в качестве последнего параметра (мы подробно рассматривали эту структуру в параграфе «Кто послал сообщение?»), есть два флага:

msglen Указывает на фактическое количество данных, переданное функцией MsgReceive() (qnet любит передавать по 8Кб за один раз).
srcmsglen Указывает на количество данных, которое клиент хотел передать (определяется клиентом).

Таким образом, если бы клиент желал передать 1 мегабайт данных по сети, MsgReceive() сервера разблокировалась бы, установив параметр msglen в значение 8192 (указывая, что 8192 байта доступны в буфере); параметр srcmsglen при этом равнялся бы 1048576 (указывая, что клиент пытался переслать 1 мегабайт данных).

Затем сервер использует MsgRead() для получения остальной части данных из адресного пространства клиента.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

2.4.2. Клиент для мгновенного обмена сообщениями Pidgin

Из книги Fedora 8 Руководство пользователя автора Колисниченко Денис Николаевич

2.4.2. Клиент для мгновенного обмена сообщениями Pidgin Практически каждый пользователь Интернета использует ICQ или другой сервис для мгновенного обмена сообщениями. У нас популярнее ICQ, а на Западе - другие сервисы, например AOL AIM.Сейчас мы поговорим о том, как настроить Pidgin


Программы для обмена мгновенными сообщениями

Из книги 200 лучших программ для Интернета. Популярный самоучитель автора Краинский И

Программы для обмена мгновенными сообщениями Когда возникла первая система обмена мгновенными сообщениями (Instant Messaging), ее использовали в основном для развлечения. Сегодня с помощью таких систем деловые люди ведут переговоры и управляют сделками. Мгновенные сообщения


Глава 5 ICQ и другие системы мгновенного обмена сообщениями

Из книги Работа в Интернете автора Макарский Дмитрий

Глава 5 ICQ и другие системы мгновенного обмена сообщениями ICQ: установка и получение собственного номера. Обмен сообщениямиТонкости ICQАльтернативные клиенты ICQСети MSN и JabberЭкономим на телефоне с помощью SkypeЭлектронная почта, безусловно, хорошее средство общения, но далеко


Обмен быстрыми сообщениями в сети MSN

Из книги Самоучитель работы на компьютере автора Колисниченко Денис Николаевич

Обмен быстрыми сообщениями в сети MSN Протокол MSNP (от англ. Mobile Status Notification Protocol – протокол для мобильного оповещения) используется в программах MSN Messenger, Windows Messenger, которые уже несколько устарели, но продолжают эксплуатироваться, а также в программе Windows Live Messenger (рис. 5.7),


Глава 19 Болталка ICQ. Программа для мгновенного обмена сообщениями

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Глава 19 Болталка ICQ. Программа для мгновенного обмена сообщениями 19.1. Что такое ICQ ICQ — один из самых популярных сервисов мгновенного обмена сообщениями. Это своего рода Интернет-пейджер. Аббревиатура ICQ означает «I seek you» («Я ищу тебя»), в России эту программу принято


Приложение Организация обмена сообщениями (Владимир Зайцев)

Из книги Windows Vista. Трюки и эффекты автора Зозуля Юрий

Приложение Организация обмена сообщениями (Владимир Зайцев) Обмен сообщениями (message passing) является основой архитектуры ОС QNX, на которой строится значительная часть служебных функций системы. Несмотря на свою «элементарность», он является удобным (и в силу своей


Организация обмена сообщениями на основе «семейных» процессов

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Организация обмена сообщениями на основе «семейных» процессов Рассмотрим, как можно организовать обмен сообщениями между потоками, принадлежащими процессам, связанным «родственными узами». Для простоты изложения, чтобы в дальнейшем не формулировать «поток,


Пример обмена сообщениями с помощью менеджера ресурсов

Из книги Как пользоваться Интернетом после принятия закона «Об Интернете» автора Халявин Василий

Пример обмена сообщениями с помощью менеджера ресурсов Код файла заголовков #define NET_OPER "/net/904-3"#define NET_REG "/net/Bed-Test"// Максимальная длина обычного стандартного сообщения.#define MESSIZE_MAX 100// Максимальная длина инвентаризационного имени процесса#define PROC_NAME_MAX 100struct IdLabel_t { // Структура,


7.1. Особенности настройки сети в Windows Vista

Из книги Анонимность и безопасность в Интернете. От «чайника» к пользователю автора Колисниченко Денис Николаевич

7.1. Особенности настройки сети в Windows Vista В Windows Vista процесс создания простых одноранговых сетей значительно упрощен. Если в Windows ХР для настройки сети нужно было запускать специальный мастер, то в Vista при использовании параметров по умолчанию сеть начинает работать


Применение обмена сообщениями

Из книги Социальные сети без страха для тех, кому за... автора Виннер Марина

Применение обмена сообщениями Теперь, когда мы рассмотрели базовые концепции обмена сообщениями и выяснили, что он используется даже в таких обычных повседневных вещах как библиотека языка Си, давайте рассмотрим кое-какие детали.Архитектура и структураМы рассуждали о


Обмен сообщениями в сети

Из книги автора

Обмен сообщениями в сети Прозрачный обмен сообщениями в сети не поддерживается в версии QNX/Neutrino 2.00, но это намечено к реализации в более поздних версиях данной ОС. (Поддержка этого механизма реализована в QNX/Neutrino, начиная с версии 2.11, и присутствует в QNX Realtime Platform, начиная


Анализ обмена сообщениями

Из книги автора

Анализ обмена сообщениями В QNX4 клиент мог найти сервер двумя способами:• используя глобальное пространство имен;• выполнение open() в отношении администратора ввода/вывода.«Клиент/сервер» с использованием глобального пространства именЕсли взаимоотношения


12.2.4. Выбор программы для мгновенного обмена сообщениями. Настройка проприетарных клиентов для работы через Tor

Из книги автора

12.2.4. Выбор программы для мгновенного обмена сообщениями. Настройка проприетарных клиентов для работы через Tor Таких программ тоже предостаточно. Вот неполный список клиентов для мгновенного обмена сообщениями с открытым кодом:? Instantbird (http://www.instantbird.com/) – поддерживает