Автор работы: Пользователь скрыл имя, 30 Октября 2012 в 22:35, контрольная работа
Целью работы является исследование времени реакции сервера на сетевые запросы клиентов, формируемые в реальном масштабе времени.
Для достижения цели необходимо решить следующие задачи:
Разработать серверное приложение, которое получает запросы по протоколу TCP|UDP от некоторого количества клиентов и выполняет обработку этих запросов.
Разработать консольное клиентское приложение, которое производит подключение к заданному серверу и через некоторые промежутки времени формирует запрос к нему по протоколу TCP|UDP.
Исследовать время передачи и обработки пакетов серверным приложением.
1. Расчетно-графическая работа. Исследование временных характеристик многопоточного приложения в ОСРВ QNX во время обработки информации от периферийных устройств
2. Введение
3. Алгоритм
4. Программная реализация
5. Выводы
6. Литература
Далее рассмотрим особенности программной реализации алгоритмов клиента и сервера для ОС РВ.
Программная реализация
Обзор
При разработке приложения, предполагается использовать среду разработки QNX Momentics v4.7. В качестве языка программирования будет использоваться язык C.
Тестирование приложения и эксперименты будет производиться на реальной ОС РВ QNX 6.5 Neutrino v2, развернутой на виртуальной машине VMWare.
Сервер
Предполагается передача конфигурации
сервера через командную
Код программы:
/*
* ResMgr and Message Server Process
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/neutrino.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
resmgr_connect_funcs_t ConnectFuncs; resmgr io funcs t IoFuncs;
iofunc_attr_t IoFuncAttr;
typedef struct {
uint16 t msg no; char msg data[255];
} server msg t;
int message callback( message context t *ctp, int type, unsigned flags,
void *handle )
{
server msg t *msg; int num;
char msg reply[255];
/* cast a pointer to the message data */ msg = (server msg t *)ctp->msg;
/* Print out some usefull information on the message */
printf( "\n\nServer Got Message:\n" );
printf( " type: %d\n" , type );
printf( " data: %s\n\n", msg->msg data );
/* Build the reply message */ num = type - _IO_MAX;
snprintf( msg reply, 254, "Server Got Message Code: IO MAX + %d", num );
/* Send a reply to the waiting (blocked) client */
MsgReply( ctp->rcvid, EOK, msg reply, strlen( msg reply ) + 1 );
return 0;
}
int main( int argc, char **argv ) {
resmgr attr t resmgr attr;
message attr t message attr;
dispatch t *dpp;
dispatch context t *ctp, *ctp ret;
int resmgr id, message id;
/* Create the Dispatch Interface */ dpp = dispatch create();
if( dpp == NULL ) {
fprintf( stderr, "dispatch create() failed: %s\n",
strerror( errno ) ); return EXIT_FAILURE;
}
memset( &resmgr attr, 0, sizeof( resmgr attr ) ); resmgr attr.nparts max = 1;
resmgr attr.msg max size = 2048;
/* Setup the default I/O functions to handle open/read/write/... */
iofunc func init( _RESMGR_CONNECT_NFUNCS, &ConnectFuncs,
_RESMGR_IO_NFUNCS, &IoFuncs );
/* Setup the attribute for the entry in the filesystem */ iofunc_attr_init( &IoFuncAttr, S_IFNAM | 0666, 0, 0 );
resmgr id = resmgr attach( dpp, &resmgr attr, "serv", FTYPE ANY,
0, &ConnectFuncs, &IoFuncs, &IoFuncAttr );
if( resmgr id == -1 ) {
fprintf( stderr, "resmgr attach() failed: %s\n", strerror( errno ) ); return EXIT_FAILURE; _
}
/* Setup our message callback */
memset( &message attr, 0, sizeof( message attr ) ); message attr.nparts max = 1; message attr.msg max size = 4096;
/* Attach a callback (handler) for two message types */ message id = message attach( dpp, &message attr, IO MAX + 1,
_IO_MAX + 2, message_callback, NULL );
if( message id == -1 ) {
fprintf( stderr, "message attach() failed: %s\n", strerror( errno ) ); return EXIT_FAILURE; _
}
/* Setup a context for the dispatch layer to use */ ctp = dispatch context alloc( dpp );
if( ctp == NULL ) {
fprintf( stderr, "dispatch context alloc() failed: %s\n",
strerror( errno ) ); return EXIT_FAILURE;
}
/* The "Data Pump" - get and process messages */
while( 1 ) {
ctp ret = dispatch block( ctp );
if( ctp ret ) {
dispatch handler( ctp );
}
else {
fprintf( stderr, "dispatch block() failed: %s\n",
strerror( errno ) ); return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}
Клиент
Предполагается передача конфигурации
клиента через командную
client -saddr:<serveripaddress> -sport:<serverport> -caddr:<clientipaddress> - tp:<timeperiod> -tk:<ktimeparam> -tb:<btimeparam> -maxsize:<maxpacketsize> - pk:<kpacketparam> -pb:<bpacketparam>
где
Код программы:
/*
* Message Client Process */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/neutrino.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
typedef struct {
uint16_t msg_no; char msg_data[255]; } client_msg_t;
int main( int argc, char **argv ) {
int fd; int c;
client_msg_t msg; int ret; int num;
char msg_reply[2 55]; num = 1;
/* Process any command line arguments */
while( ( c = getopt( argc, argv, "n:" ) ) != -1 ) {
if( c == 'n' ) {
num = strtol( optarg, 0, 0 );
}
}
/* Open a connection to the server (fd == coid) */ fd = open( "serv", O_RDWR );
if( fd == -1 ) {
fprintf( stderr, "Unable to open server connection: %s\n",
strerror( errno ) ); return EXIT_FAILURE;
}
/* Clear the memory for the msg and the reply */
memset( &msg, 0, sizeof( msg ) );
memset( &msg_reply, 0, sizeof( msg_reply ) );
/* Setup the message data to send to the server */ msg.msg_no = _IO_MAX + num;
snprintf( msg.msg_data, 254, "client %d requesting reply.", getpid() );
printf( "client: msg_no: _IO_MAX + %d\n", num ); fflush( stdout );
/* Send the data to the server and get a reply */
ret = MsgSend( fd, &msg, sizeof( msg ), msg_reply, 255 );
if( ret == -1 ) {
fprintf( stderr, "Unable to MsgSend() to server: %s\n", strerror( errno ) ); return EXIT_FAILURE;
}
/* Print out the reply data */
printf( "client: server replied: %s\n", msg_reply ); close( fd );
return EXIT_SUCCESS;
}
Сетевое взаимодействие
Порядок выполнения подключения к серверу:
Обработка ошибок
Обработка ошибок производится посредством обработки исключительных ситуаций, а также проверки состояния после выполнения соответствующих системных вызовов.
Эксперимент
Описание экспериментальной
По причине отсутствия необходимого количества доступных компьютеров для установки OS QNX, а также отсутствия необходимых лицензий для установки OS QNX, предполагается использование виртуальных машин VMWare, запущенных на компьютерах под управлением ОС Windows XP SP3.
Далее остановимся на конфигурации компьютеров и программном обеспечении задействованных в эксперименте.
Аппаратное обеспечение
В случае наличия очень мощного многопроцессорного и многоядерного компьютера, допускается моделирование распределенной вычислительной системы с помощью набора виртуальных машин функционирующих в рамках монитора виртуальных машин VMWare посредством виртуальной сети VMWare Ethernet. Для всех клиентов и сервера использовался один и тот же образ виртуальной машины. В настройках монитора виртуальных машин VMWare Workstation для всех сетевых адаптеров было установлено Network Adapter было выполнено соединение Briged.
Результаты эксперимента
Для проведения эксперимента была развернута виртуальная Gigabit Ethernet сеть, которая формируется монитором виртуальных машин VMWare, с описанной конфигурацией и программным обеспечением.
Порядок выполнения эксперимента:
server -addr:192.168.1.67 -port:8099 -maxconn:4 -log:log.svr где
client -saddr:192.168.1.67 -sport:8099 -caddr:192.168.1.69 -tp:15 -tk:25 - tb:70 -maxsize:3072 -pk:1600 -pb:128
где
client -saddr:192.168.1.67 -sport:8099 -caddr:192.168.1.
client -saddr:192.168.1.67 -sport:8099 -caddr:192.168.1.
client -saddr:192.168.1.67 -sport:8099 -caddr:192.168.1.
Управление клиентами, проводилось через удаленное соединение, посредством IDE QNX Momentics через вкладку Target Navigator. Отметим, что для этого на каждой удаленной машине, необходимо запустить qconn. Узнать IP адрес каждого клиента можно посредством выполнения команды ifconfig.
Выводы
В результате выполнения лабораторной работы можно сделать следующие выводы:
Литература
1. Microsoft Developer Network. URL: http://www.msdn.com