Санкт-Петербургский государственный технический университет Факультет Технической Кибернетики
Кафедра Компьютерных Систем и Программных Технологий
ЛАБОРАТОРНАЯ РАБОТА №3
Дисциплина: Системное программное обеспечение
Тема: Разработка клиент-серверного приложения
Выполнил студент гр. 4081/1
Руководитель, к.т.н., доцент
"___ "_________ 2011 г.
Санкт-Петербург 2011
1. Алгоритм круговой интерполяции.
Круговая интерполяция реализована по методу оценочной функции. Согласно методу оценочной функции при интерполяции моделируется алгебраическое уравнение воспроизводимой кривой. Сущность метода в том, что по результатам шага вдоль какой- либо управляемой координаты, вычисляется оценочная функция F, знак которой определяет направление следующего шага, причем перемещение, возникающее в результате этого шага, приближает отрабатываемую траекторию к идеальной кривой.
При круговой интерполяции по методу оценочной функции вводится оценочная функция вида:
Для интерполирования дуги окружности нужно знать номер квадранта и координаты начальной и конечной точек дуги.
Алгоритм воспроизведения дуги окружности в положительном направлении (против часовой стрелки) в первом квадранте:
1. Если оценочная функция , то очередной шаг делает вдоль отрицательного направления оси X, то есть ;
2. Если оценочная функция , то очередной шаг делает вдоль положительного направления оси Y, то есть
3. Вычисляется очередное значение оценочной функции
Алгоритм реализован по материалам лекций курса «Локальные системы управления», который читается по нашей специальности на 1 семестре 4го курса.
2. Реализация алгоритма интерполяции в виде клиент-серверного приложения.
Для исследования локального и сетевого вариантов приложения написаны общие программы. Вариант запуска или локально, или в сетевом варианте задается в опциях командной строки. Для локального варианта это опция ”-l”, для сетевого ”-g”(глобальный).
В зависимости от заданной опции в программе-сервере происходит регистрация локального или глобального имени. Для сетевого обмена необходимо, чтобы на используемых узлах сети была запущена утилита gns.
Программа-сервер.
Листинг 2.1.1. Файл msgdefs.h. Определение форматов сообщений.
/*
* defs.h
* Файл содержит определение форматов сообщений
*
* Created on: 06.05.2011
* Author: And
*/
#ifndef DEFS_H_
#define DEFS_H_
#define ATTACH_POINT "cir_interp_server"
#define MAX_BUF 8192
typedef struct PointT {
int X;
int Y;
} PointT;
typedef struct ClientMsgT {
PointT startPoint;
PointT centerPoint;
int angle;
int clockwise;
int step;
} ClientMsgT;
typedef struct ServerMsgT {
int lenVector;
PointT resultVector[MAX_BUF];
} ServerMsgT;
typedef _pulse PulseMsgT;
union MsgT {
PulseMsgT header;
ClientMsgT clientMsg;
ServerMsgT serverMsg;
};
#endif /* DEFS_H_ */
Листинг 2.1.2. Файл CircularInterpolation_Server.cc. Основной файл программы.
#include <cstdlib>
#include <math.h>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <cerrno>
#include <sys/dispatch.h>
using namespace std;
#include "msgdefs.h"
// Вычисление следующей точки //
PointT nextPoint( int X, int Y, int R, int step, int clockwise );
// Вычисление следующей точки по часовой стрелке //
PointT nextPointClockwise( int X, int Y, int R, int step );
// Вычисление следующей точки против часовой стрелке //
PointT nextPointAntiClockwise( int X, int Y, int R, int step );
void MsgProc();
name_attach_t* msg_chanel;
int rcv_id;
MsgT msg;
int main( int argc, char *argv[] )
{
// Проверка командных опций программы //
if (argc < 2) {
cerr << "Server: cmd args error!" << endl;
exit(1);
}
unsigned int flag;
if (strcmp(argv[1],"-l") == 0) flag = 0;
else if (strcmp(argv[1],"-g") == 0) flag = NAME_FLAG_ATTACH_GLOBAL;
else {
cerr << "Server: cmd args error!" << endl;
exit(1);
}
// Регистрация канала //
msg_chanel = name_attach( NULL, ATTACH_POINT, flag );
if (msg_chanel == NULL) {
cerr << "Server: name attach error!" << endl;
exit(2);
}
cout << "Server: started." << endl;
// Ожидание и прием сообщений от клиентов //
while (1)
{
rcv_id = MsgReceive( msg_chanel->chid, &msg, sizeof(msg), NULL );
switch (rcv_id)
{
// Ошибка MsgReceive //
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.