Мы еще вернемся к обсуждению аргумента
int chid;
chid = ChannelCreate(0);
Теперь у нас есть канал. В этом пункте клиенты могут подсоединиться (с помощью функции
Связь между каналом сервера и клиентским соединением.
В терминах обмена сообщениями, сервер отрабатывает схему обмена в два этапа — этап «приема» (receive) и этап «ответа» (reply).
Взаимосвязь функций клиента и сервера при обмене сообщениями.
Обсудим сначала два простейших варианта соответствующих функций,
#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. Клиент вызывает функцию
2. Функция
3. Сервер завершил обработку сообщения и теперь использует идентификатор отправителя
4. Наконец, ядро передает параметр
Вы, возможно, заметили, что для каждой буферной передачи указываются два размера (в случае запроса от клиента клиента это
В нашем примере размер буфера функции
Вот общая структура сервера:
#include
...
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\n", rcvid);
printf("Сообщение такое: \"%s\".\n", message);
// Подготовить ответ — используем тот же буфер
strcpy(message, "Это ответ");
MsgReply(rcvid, EOK, message, sizeof(message));
}
}
Как видно из программы, функция sizeof(message)
(или 512 байт). Наш клиент (представленный выше) передал только 28 байт (длина строки). На приведенном ниже рисунке это и показано:
Передача меньшего объема данных, чем предполагается.
Ядро реально передает