int res, i; // промежуточные переменные
int coid; // Идентификатор канала сервера
float smsg [102]; // Буфер отправляемого сообщения
float rmsg [1000]; // Буфер принимаемого сообщения
FILE* finp; // Указатель на файл исходных данных
FILE* foutp; // Указатель на файл результатов
// Открытие файла ввода
finp=fopen("/home/mary/Interp/inp.txt","r");
if (finp==NULL)
{
printf ("Error #6: Can't open input file %s.", argv [1]);
return 6;
}
// Считывание данных из файла ввода
res=fscanf(finp," %d %d",&p_numb, &i_numb);
if (res!=2)
{
printf("Error #3: Can't get point numbers.");
return 3;
}
// Проверка допустимости значения количества исходных точек
if ((p_numb<2)||(p_numb>50))
{
printf("Error #4: Data points number must be numeric in [2..50].");
return 4;
}
// Проверка допустимости количества требуемых точек
if ((i_numb<2)||(i_numb>500))
{
printf("Error #5: Data points number must be numeric in [2..500].");
return 5;
}
// Загрузка количества точек в буфер передачи
smsg[0]=p_numb;
smsg[1]=i_numb;
// Считывание исходных точек из файла в буфер передачи
for (i=2;i<p_numb*2+2;i++)
{
res=fscanf(finp, " %f", &smsg[i]);
if (res !=1)
{
printf ("Error #7: Can't get points from file '%s'",argv[1]);
return 7;
}
}
// Закрытие файла ввода
fclose(finp);
// Подключение к именованному каналу
coid = name_open("int_server", NAME_FLAG_ATTACH_GLOBAL);
if (coid == -1)
{
printf("Error #2: Can't find server 'int_server'\n");
return 2;
}
// Отправка сообщения серверу
MsgSend(coid, smsg, (p_numb*2+2)*sizeof(float), rmsg, i_numb*sizeof(float)*2);
// Открытие файла результатов
foutp=fopen("/home/mary/Interp/outp.txt","w");
if (foutp==NULL)
{
printf ("Error #9: Can't open output file %s.",argv [2]);
return 9;
}
// Вывод результатов интерполяции в консоль и файл
printf("Time\tValue\n");
for (i=0;i<i_numb;i++)
{
printf ("%8.3f\t%8.3f\n",rmsg[2*i],rmsg[2*i+1]);
fprintf (foutp,"%8.3f\t%8.3f\n",rmsg[2*i],rmsg[2*i+1]);
}
// Закрытие файла вывода результатов
fclose (foutp);
// Успешный выход из программы
return 0;
}
Текст interp_server.c.
#include <stdio.h>
#include <errno.h>
#include <sys/iofunc.h>
#include <sys/dispatch.h>
#include <unistd.h>
// Прототип функции интерполяции
void interpolate(int p_numb, int i_numb, float* data, float* result);
// Основная функция проекта
int main(void)
{
int rcvid; // ID клиента
float msg_buf[1002]; // Буфер приёма и передачи
name_attach_t *res; // Информация о клиенте
int p_numb; // Количество требуемых! точек
// Создание именованного канала
res = name_attach(NULL, "int_server", NAME_FLAG_ATTACH_GLOBAL );
if (res==NULL)
{
printf("Error #%d: Cant't create channel\n", errno);
return 1;
}
else
printf ("Server's channel created\n");
// Цикл обработки сообщений от клиента
while(1)
{
// приём сообщения в буфер msg_buf
rcvid = MsgReceive(res->chid, &msg_buf[0], 102*sizeof(float), NULL);
if (rcvid > 0)
{
p_numb= msg_buf[1];
// Интерполяция
interpolate (msg_buf[0], msg_buf[1], &msg_buf[2], msg_buf);
// Отправка результата клиенту
MsgReply(rcvid,p_numb*sizeof(float),msg_buf,p_numb*2*sizeof(float));
}
}
return 0;
}
Тексты программ приведены для сетевой организации (клиент и сервер – разные машины), для локальной реализации следует изменить флаг глобальной передачи:
в сервере:
изменить параметр 3 в функции name_attach на 0
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.