Разработка клиент-серверного приложения. Алгоритм круговой интерполяции. Реализация алгоритма интерполяции в виде клиент-серверного приложения

Страницы работы

Содержание работы

Санкт-Петербургский государственный технический университет Факультет Технической Кибернетики

Кафедра Компьютерных Систем и Программных Технологий

ЛАБОРАТОРНАЯ РАБОТА №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 //

Похожие материалы

Информация о работе