Санкт-Петербургский государственный технический университет Факультет Технической Кибернетики
Кафедра Компьютерных Систем и Программных Технологий
ЛАБОРАТОРНАЯ РАБОТА №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).
Ссылка на скачивание - внизу страницы.