Санкт-Петербургский Государственный Политехнический Университет
Факультет Технической Кибернетики
Кафедра Компьютерных Систем и Программных Технологий
Отчёт по операционной QNX
на тему : Графическое клиент-серверное приложение на примере интерполяции
Выполнил студент группы 4081/1
Санкт-Петербург
2010
Задание:
Создать клиен-серверное приложение, которое читает данные из файла, производит интерполяцию с заданным шагом и визуализирует результат.
- Сервер должен принимать сообщение от клиента, которое содержит шаг интерполяции и данные для интерполяции.
- Клиент читает данные из файла и посылает их серверу, принимает от сервера результат и строит график.
Теоретические данные
Кусочно-линейная интерполяция:
При таком способе интерполяции соседние точки соединяются прямыми. Формула интерполяционного полинома:
1. Описание приложения
Вид главного окна программы клиента представлен на рис.1.1.
Рис.1.1. Окно клиентской программы
Где,
Step – шаг интерполяции
Local/Global – локальный или глобальный канал
Load and Run – открывает файл с указанным названием, читает из него данные, формирует сообщение для клиента и отправляет его. После получения результата строит интерполяционный полином.
Код обработчика начатия на кнопку Load and Run приведён в Листинге 1.
Листинг 1.
Button1_Click.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
/* Local headers */
#include "ablibs.h"
#include "abimport.h"
#include "proto.h"
#include <sys/dispatch.h>
#define ATTACH_POINT "Inter_channel"
typedef struct _pulse msg_header_t;
typedef struct _my_data {
msg_header_t hdr;
int len, maxX, maxY;
double h, dataX[100], dataY[100];
} my_data_t;
my_data_t msg, msg_reply;
int net_send();
char str[] = "Hello World!!!",
*file_name, buf[40];
int bpointx = 119, bpointy = 35,
epointx, epointy, dx, dy,h, i, k;
int
Button1_Click( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ){
double scalex, scaley;
/* eliminate 'unreferenced' warnings */
widget = widget, apinfo = apinfo, cbinfo = cbinfo;
PtGetResource(ABW_Text, Pt_ARG_TEXT_STRING,&file_name, 0 );
buf[0] = '\0';
epointx = bpointx + 361 -2;
epointy = bpointy + 385 -4;
switch( net_send() ){
case 1:
PtSetResource(ABW_Label1, Pt_ARG_TEXT_STRING, "Not find File", 0 );
strcat(buf, "\"" );
strcat(buf, file_name );
strcat(buf, "\"" );
PtSetResource(ABW_Label2, Pt_ARG_TEXT_STRING, buf, 0 );
return( Pt_CONTINUE );
case 2:
PtSetResource(ABW_Label1, Pt_ARG_TEXT_STRING, "Not Attach to", 0 );
PtSetResource(ABW_Label2, Pt_ARG_TEXT_STRING, " channel ", 0 );
return( Pt_CONTINUE );
}
PtSetResource(ABW_Label1, Pt_ARG_TEXT_STRING, "Sucsessful Load", 0 );
PtSetResource(ABW_Label2, Pt_ARG_TEXT_STRING, " ", 0 );
scalex = (double)(epointx - bpointx)/(double)msg_reply.maxX;
scaley = (double)(epointy - bpointy)/(double)msg_reply.maxY;
itoa( msg_reply.maxX, buf, 10 );
PtSetResource(ABW_Xm, Pt_ARG_TEXT_STRING,buf, 0 );
itoa( msg_reply.maxY, buf, 10 );
PtSetResource(ABW_Ym, Pt_ARG_TEXT_STRING,buf, 0 );
PgSetStrokeColor( Pg_GREEN );
for( i=0; i<msg_reply.len-1; i++ ){
PgDrawILine( bpointx+(int)(msg_reply.dataX[i]*scalex),epointy-(int)(msg_reply.dataY[i]*scaley),
bpointx+(int)(msg_reply.dataX[i+1]*scalex),epointy- (int)(msg_reply.dataY[i+1]*scaley ) );
}
dx = 10; dy = 10;
PgSetStrokeColor( Pg_BLACK );
for( i=1; i<dx; i++ ){
h =( epointx-bpointx )/ dx;
PgDrawILine( bpointx+h*i, bpointy,bpointx+h*i, epointy );
}
for( i=1; i<dy; i++ ){
h =( epointy-bpointy )/ dy;
PgDrawILine( bpointx, bpointy+h*i, epointx,bpointy+h*i );
}
return( Pt_CONTINUE );
}
// NET SEND -read and send message
int net_send(){
int fd, i;
FILE *p;
char *combo_text, *str_step;
if( (p = fopen( file_name, "r" )) == NULL ){
return 1;
}
PtGetResource(ABW_Combo, Pt_ARG_TEXT_STRING,&combo_text, 0 );
if( !strcmp( combo_text, "Local") ){
if ((fd = name_open(ATTACH_POINT, 0)) == -1) {
return 2;
}
}else{
if ((fd = name_open(ATTACH_POINT, NAME_FLAG_ATTACH_GLOBAL)) == -1) {
fclose( p );
return 2;
}
}
msg.hdr.type = 0x00;
msg.hdr.subtype = 0x00;
fscanf( p, "%d %d %d", &msg.len, &msg.maxX, &msg.maxY );
PtGetResource( ABW_TextStep, Pt_ARG_TEXT_STRING,&str_step, 0 );
msg.h = atof( str_step );
if( msg.h <= 0 && msg.h > 10 ){
fclose( p );
name_close( fd );
return 3;
}
for( i=0; i<msg.len; i++ )
fscanf( p, "%lf %lf", &msg.dataX[i], &msg.dataY[i] );
MsgSend(fd, &msg, sizeof(msg), &msg_reply, sizeof(msg_reply) );
name_close( fd );
fclose( p );
return 0;
}
Код сервера приведён в Листинге 2:
Листинг 2.
Inter.c
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/dispatch.h>
#define ATTACH_POINT "Inter_channel"
typedef struct _pulse msg_header_t;
typedef struct _my_data {
msg_header_t hdr;
int len, maxX, maxY;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.