Сервер
Сервер
Теперь, когда мы рассмотрели клиента, перейдем к серверу. Клиент использовал функцию ConnectAttach() для создания соединения с сервером, а затем использовал функцию MsgSend() для передачи сообщений.
Создание канала
Под этим подразумевается, что сервер должен создать канал — то, к чему присоединялся клиент, когда вызывал функцию ConnectAttach(). Обычно сервер, однажды создав канал, приберегает его «впрок».
Канал создается с помощью функции ChannelCreate() и уничтожается с помощью функции ChannelDestroy():
#include <sys/neutrino.h>
int ChannelCreate(unsigned flags);
int ChannelDestroy(int chid);
Мы еще вернемся к обсуждению аргумента flags (в разделе «Флаги каналов», см. ниже), а покамест будем использовать для него значение 0 (ноль). Таким образом, для создания канала сервер должен сделать так:
int chid;
chid = ChannelCreate(0);
Теперь у нас есть канал. В этом пункте клиенты могут подсоединиться (с помощью функции ConnectAttach()) к этому каналу и начать передачу сообщений:
Связь между каналом сервера и клиентским соединением.
Обработка сообщений
В терминах обмена сообщениями, сервер отрабатывает схему обмена в два этапа — этап «приема» (receive) и этап «ответа» (reply).
Взаимосвязь функций клиента и сервера при обмене сообщениями.
Обсудим сначала два простейших варианта соответствующих функций, MsgReceive() и MsgReply(), а далее посмотрим, какие есть варианты.
#include <sys/neutrino.h>
int MsgReceive(int chid, void *rmsg, int rbytes,
struct _msg_info *info);
int MsgReply(int rcvid, int status, const void *msg,
int nbytes);
Посмотрим, как соотносятся параметры:
Поток данных при обмене сообщениями.
Как видно из рисунка, имеются четыре элемента, которые мы должны обсудить:
1. Клиент вызывает функцию MsgSend() и указывает ей на буфер передачи (указателем smsg и длиной sbytes). Данные передаются в буфер функции MsgReceive() на стороне сервера, по адресу rmsg и длиной rbytes. Клиент блокируется.
2. Функция MsgReceive() сервера разблокируется и возвращает идентификатор отправителя rcvid, который будет впоследствии использован для ответа. Теперь сервер может использовать полученные от клиента данные.
3. Сервер завершил обработку сообщения и теперь использует идентификатор отправителя rcvid, полученный от функции MsgReceive(), передавая его функции MsgReply(). Заметьте, что местоположение данных для передачи функции MsgReply() задается как указатель на буфер (smsg) определенного размера (sbytes). Ядро передает данные клиенту.
4. Наконец, ядро передает параметр sts, который используется функцией MsgSend() клиента как возвращаемое значение. После этого клиент разблокируется.
Вы, возможно, заметили, что для каждой буферной передачи указываются два размера (в случае запроса от клиента клиента это sbytes на стороне клиента и rbytes на стороне сервера; в случае ответа сервера это sbytes на стороне сервера и rbytes на стороне клиента). Это сделано для того, чтобы разработчики каждого компонента смогли определить размеры своих буферов — из соображений дополнительной безопасности.
В нашем примере размер буфера функции MsgSend() совпадал с длиной строки сообщения. Давайте теперь рассмотрим, что происходит в сервере и как размер используется там.
Структура сервера
Вот общая структура сервера:
#include <sys/neutrino.h>
...
void server(void) {
int rcvid; // Указывает, кому надо отвечать
int chid; // Идентификатор канала
char message[512]; // Достаточно велик
// Создать канал
chid = ChannelCreate(0);
// Выполняться вечно — для сервера это обычное дело
while (1) {
// Получить и вывести сообщение
rcvid = MsgReceive(chid, message, sizeof(message), NULL);
printf("Получил сообщение, rcvid %X ", rcvid);
printf("Сообщение такое: "%s". ", message);
// Подготовить ответ — используем тот же буфер
strcpy(message, "Это ответ");
MsgReply(rcvid, EOK, message, sizeof(message));
}
}
Как видно из программы, функция MsgReceive() сообщает ядру о том, что она может обрабатывать сообщения размером вплоть до sizeof(message) (или 512 байт). Наш клиент (представленный выше) передал только 28 байт (длина строки). На приведенном ниже рисунке это и показано:
Передача меньшего объема данных, чем предполагается.
Ядро реально передает минимум из двух указанных размеров. В нашем случае ядро передало бы 28 байт, сервер бы разблокировался и отобразил сообщение клиента. Оставшиеся 484 байта (из буфера длиной 512 байт) остались бы нетронутыми.
Аналогичная ситуация с функцией MsgReply(). Функция MsgReply() информирует, что собирается передать 512 байт, но функция MsgSend() определила, что может принять максимум 200 байт. Ядро опять передает минимум. В этом случае 200 байтов, которые клиент может принять, ограничивают размер передачи. (Один интересный аспект здесь состоит в том, что когда сервер передаст данные, то если клиент не примет их целиком, как в нашем примере, их уже нельзя будет вернуть — они будут потеряны.).
Имейте в виду, что такое «урезание» является стандартным и ожидаемым поведением.
Когда мы будем обсуждать обмен сообщениями по сети, вы увидите, что в количестве передаваемых данных есть кое-какое «ага». Мы проанализируем это далее в разделе «Особенности обмена сообщениями в сети».
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Сервер
Сервер Теперь, когда мы рассмотрели клиента, перейдем к серверу. Клиент использовал функцию ConnectAttach() для создания соединения с сервером, а затем использовал функцию MsgSend() для передачи сообщений.Создание каналаПод этим подразумевается, что сервер должен создать канал —
Web-сервер
Web-сервер Когда мы тестировали нашу первую Web-страницу, то прекрасно обошлись без Web-сервера, открыв ее прямо в Web-обозревателе. Но в дальнейшем, особенно когда мы начнем реализовывать подгрузку содержимого, Web-сервер все-таки нам понадобится. Многие Web-сценарии нормально
6.11. Эхо-сервер TCP (еще раз)
6.11. Эхо-сервер TCP (еще раз) Теперь мы изменим наш эхо-сервер TCP из раздела 6.8, используя вместо функции select функцию poll. В предыдущей версии сервера, работая с функцией select, мы должны были выделять массив client вместе с набором дескрипторов rset (см. рис. 6.12). С помощью функции poll мы
Сервер
Сервер Сервером называют постоянно работающий компьютер, подключенный к Сети. Если вернуться к нашему парку развлечений, то сервер – это один из его аттракционов. Помимо основных функций хранения и передачи информации, сервер может являться входом в Интернет для
Выделенный сервер
Выделенный сервер Под словосочетанием «выделенный сервер» понимается обыкновенный сервер, то есть компьютер, постоянно подключенный к Интернету и сконфигурированный для работы в нем. Слово «выделенный» подчеркивает, что этот сервер ни от кого не зависит и находится в
Глава 7 Web-сервер
Глава 7 Web-сервер Несмотря на то, что изначально сеть создавалась для обмена файлами, с появлением первого браузера популярность WWW-страниц начала расти не по дням, а по часам. Сейчас уже трудно себе представить не только Интернет, но и интранет без Web-страниц.Для того чтобы
Глава 11 DNS-сервер
Глава 11 DNS-сервер Каждый компьютер, подключенный к сети, должен иметь свой адрес, чтобы его легко можно было найти и обмениваться с ним данными. Это как телефонные аппараты. Чтобы кому-нибудь позвонить, нужно знать его номер телефона, иначе коммутатор не сможет понять, с кем
Сервер INN
Сервер INN Среди серверов новостей, предназначенных для выполнения в системе Linux, наиболее популярным является InterNetNews, или INN (http://www.isc.org/products/INN). Пакет INN состоит из нескольких программ, работающих совместно. Основная программа, innd, предназначена для обработки новых статей
Web-сервер
Web-сервер Когда мы тестировали нашу первую Web-страницу, то прекрасно обошлись без Web-сервера, открыв ее прямо в Web-обозревателе. Но в дальнейшем, особенно когда мы начнем реализовывать подгрузку содержимого, Web-сервер все-таки нам понадобится. Многие Web-сценарии нормально
FTP-сервер
FTP-сервер В настоящее время мы предпочитаем использовать для конфигурации аппаратов Polycom протокол FTP (File Transfer Protocol - протокол передачи файлов)1. Мы бы рекомендовали выбрать его, а не TFTP и для устройств, которые могут работать с обоими протоколами. В системе CentOS при
Конфигурируем сервер
Конфигурируем сервер В конце установки программы на экране откроется диалоговое окно конфигурирования сервера (рис. 9.4). Это значит, что нам необходимо произвести настройку сервера именно сейчас. Во всяком случае, нужно установить пароль для подключения, иначе мы просто
Сервер
Сервер С помощью данной службы обеспечивается общий доступ к файлам, принтерам и именованным каналам данного компьютера. Иными словами, если данная служба будет отключена, то на компьютере нельзя будет создавать общедоступные ресурсы, а сетевые компьютеры не смогут
1.3.1. Прокси-сервер – что это?
1.3.1. Прокси-сервер – что это? Итак, что такое прокси-сервер? Это узел сети, служащий для кэширования информации и ограничения доступа в сеть. Прокси-серверы устанавливаются как администраторами локальной сети для нужд ее самой, так и провайдерами Интернета для нужд всех их
Сервер для InterBase
Сервер для InterBase Рассмотрим компоненты сервера согласно традиционным описаниям конфигурации компьютеров: платформа, процессор, материнская плата, ОЗУ, жесткие диски, сетевую платуПлатформа. Под платформой понимается архитектура процессора, например Intel. Большинство
26.2. Web-сервер
26.2. Web-сервер 26.2.1. Установка Apache и PHP Запустите менеджер Synaptic. В поле Быстрый поиск введите apache. Щелкните правой кнопкой мыши на пакете apache2 и выберите команду Отметить для установки. Менеджер пакетов сообщит вам, что нужно установить дополнительные пакеты (рис. 26.1). Нажмите