Что такое функционирование в «Реальном масштабе времени»


Download 1.86 Mb.
Pdf ko'rish
bet61/72
Sana19.04.2023
Hajmi1.86 Mb.
#1362511
TuriУчебное пособие
1   ...   57   58   59   60   61   62   63   64   ...   72
Bog'liq
Луканов А.С. Системы реального времени 2020

 
Сервер. Создание канала
Сервер должен создать канал — то, к чему присоединялся 
клиент, когда вызывал функцию ConnectAttach(). Обычно сервер
однажды создав канал, приберегает его «впрок». 
Канал создается с помощью функции ChannelCreate() и 
уничтожается с помощью функции ChannelDestroyQ: 
#include  
int ChannelCreate (unsigned flags); 
int ChannelDestroy (int chid);
Таким образом, для создания канала сервер должен сделать 
так: 
int chid;
chid = ChannelCreate (0);


129 
Теперь у нас есть канал. В этом пункте клиенты могут 
подсоединиться (с помощью функции ConnectAttachQ) к этому 
каналу и начать передачу сообщений: 
Рис. 3.1. Связь между каналом сервера и клиентским соединением 
Обработка сообщений 
В терминах обмена сообщениями, сервер отрабатывает схему 
обмена
в два этапа: 
·
этап «приема» (receive); 
·
этап «ответа» (reply). 
Рис. 3.2. Взаимосвязь функций клиента и сервера 
при обмене сообщениями 


130 
Обсудим два простейших варианта соответствующих 
функций, MsgReceiveQ и MsgReply(). 
#include  
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). Данные 
передаются в буфер функции MsgReceiveQ на стороне сервера, по 
адресу rmsg и длиной rbytes. Клиент блокируется. 
2.
Функция MsgReceiveQ сервера разблокируется и 
возвращает идентификатор отправителя rcvid, который будет 
впоследствии использован для ответа. Теперь сервер может 
использовать полученные от клиента данные. 
3. 
Сервер завершил обработку сообщения и теперь использует 
идентификатор отправителя rcvid, полученный от функции 
MsgReceiveQ, 
передавая его функции MsgReply(). Заметьте, что 
местоположение данных для передачи функции MsgReply() 
задается как указатель на буфер (smsg) определенного размера 
(sbytes). 
Ядро передает данные клиенту. 
4. 
Наконец, ядро передает параметр sts, который используется 
функцией MsgSend() клиента как возвращаемое значение. После 
этого клиент разблокируется. 
Для каждой буферной передачи указываются два размера (в 
случае запроса от клиента это sbytes на стороне клиента и rbytes на 
стороне сервера; в случае ответа сервера это sbytes на стороне 
сервера и rbytes на стороне клиента). Это сделано для того, чтобы 
разработчики каждого компонента смогли определить размеры 
своих буферов – из соображений дополнительной безопасности. 


131 

Download 1.86 Mb.

Do'stlaringiz bilan baham:
1   ...   57   58   59   60   61   62   63   64   ...   72




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling