Межмашинное соединение с помощью сокетов

КУРСОВА РОБОТА

з дисципліни

"UNIX"

 

Виконав: студент гр. ІН.сз-31

Безпалько Є.В.

 

 

Перевірив: Бабий М.С.

 

Варіант № 2

 

Суми 2014

Содержание:

 

 


1. Задание 1.................................................................................................................................................. 3

2. Задание 2.................................................................................................................................................. 6

Список литературы:.................................................................................................................................... 9



Задание 1

Написать программу на языке C++ для компилятора g++ системы UNIX, которая бы поддерживала следующие режимы:

- создание в домашнем каталоге файла с именем list и занесение в него нескольких записей следующего содержания: наименование компьютерной техники – строковый тип, количество – целый тип, цена – вещественный тип;

- найти в файле list компьютерное устройство с наиболее высокой ценой;

- Создать новый файл list1 из записей файла list, наименование техники в которых начинается с символа “К”.

При работе с файлами использовать файловые дескрипторы.

 

Основные файловые функции Unix

Для работы с файловой системой используются следующие функции:

 

int open (const char* path, int accesmode, int permission) - прототип функции находится в fcntl.h, path - путь, permission обычно 0.

Флаги режима доступа: О_RDONLY - для чтения, О_WRONLY - для записи, O_RDWR — для чтения и записи.

Существует также модификатор доступа, например O_CREAT - если файл не существует, он создается. Функция возвращает дескриптор файла или -1 при ошибке.

 

int create (const char* path, int accesmode) - упрощенный вариант создания файла.

 

long read (int fdesc, void* buf, int size) - читается блок данных из файла.

Прототип находится в unistd.h, fdesc - файловый дескриптор, buf - адрес буфера, содержащего прочитанные данные, size - количество байтов, которое нужно прочитать из файла. Функция возвращает количество прочитанных байтов.

 

long write (int fdesc, const void* buf, int size) - записывает блок данных в файл.

Прототип - в unistd.h, параметры как в read. Функция возвращает количество байтов, успешно записанных в файл.

 

long lseek (int fdesc, long pos, int whence) - изменяет текущую позицию указателя чтения-записи в файле. Прототип - в unistd.h, pos - задает смещение в байтах, которое должно быть прибавлено к базовому адресу для получения нового смещения. Параметр whence задает базовый адрес: SEEK_CUR - текущий адрес указателя в файле; SEEK_SET - начало файла; SEEK_END - конец файла. Функция возвращает смещение.

 

Код программы

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

#include <fcntl.h>

#include <string.h>

#define N 5

 

struct TComp

{

char* name[15];

int count;

float price;

} Comp, fcomp;

 

char* fname="list";

 

void make_file()

{

int f=open(fname, O_WRONLY|O_CREAT,0);

if (f==-1)

{

perror("Ошибка открытия файла");

exit (1);

}

for(int i=0; i<N; i++)

{

puts ("Введите наименование: ");

scanf("%s",&Comp.name);

puts("Введите количество и цену: ");

scanf("%i %f", &Comp.count, &Comp.price);

write(f, &Comp, sizeof(Comp));

printf("name=%s; count=%i; price=%f;\n", Comp.name, Comp.count, Comp.price);

}

close(f);

}

 

void max_price()

{

 

fcomp.price = 0;

int f1 = open(fname, O_RDONLY, 0);

if (f1==-1)

{

perror("Ошибка открытия файла");

exit (1);

}

while (read(f1, &Comp, sizeof(Comp)))

{

if (Comp.price > fcomp.price)

{

fcomp.name = Comp.name;

fcomp.count = Comp.count;

fcomp.price = Comp.price;

}

printf("%s price is %f.\n", Comp.name, Comp.price);

}

printf("Computer %s has maximum price of %f", fcomp.name, fcomp.price);

close(f1);

}

 

 

void prosmotr()

{

int f2=open(fname, O_RDONLY,0);

if (f2==-1)

{

perror("Ошибка открытия файла");

exit (1);

}

while (read(f2, &Comp, sizeof(Comp)))

{

printf("name=%s; count=%i; price=%f;\n", Comp.name, Comp.count, Comp.price);

}

close(f2);

}

 

void main()

{

int option;

 

puts("Выберите режим: ");

puts("1-создание файла; 2-поиск устройства с макс. ценой; 3-просмотр файла:");

scanf("%i", &option);

switch(option)

{

case 1: make_file(); break;

case 2: max_price(); break;

case 3: prosmotr(); break;

}

}

 


Задание 2

Написать клиентскую и серверную программы для обмена информацией через сокеты. При этом клиентская и серверная программы должны быть установлены на разных компьютерах и выполнять следующие действия:

- Клиент передает серверу строку символов.

- Сервер получает строку от клиента , запускает новый процесс и передает ему через неименованный программный канал полученную строку. Запущенный процесс подсчитывает количество символов в строке и выводит результат на экран.

Межмашинное соединение с помощью сокетов

 

Межмашинное соединение чаще всего реализуется с помощью сокетов.

Различают сокеты с установлением соединения и без установления соединения. В зависимости от того, к какому домену принадлежит гнездо, используются разные форматы адресов сокетов и базовые транспортные протоколы. При использовании сокетов используются следующие стандартные домены: AF_UNIX (формат адреса - путевое имя Unix) и AF_INET (формат адреса - хост-имя и номер порта).

Для каждого гнезда назначается тип, посредством которого определяется способ передачи данных между двумя сокетами. Если тип сокета - виртуальный канал, то данные передаются последовательно, с достаточной степенью надежности и не дублируются. Если тип сокета - дейтаграмма, то условие последовательности пересылки данных не выполняется и надежность их передачи низкая. Тип гнезда с установлением соединения - как правило, виртуальный канал, а тип гнезда без установления соединения — дейтаграмма. Дейтаграммные сокеты обычно работают быстрее, чем виртуальные каналы, и используются в приложениях, где быстродействие важнее, чем надежность.

Сокет каждого типа поддерживает один или несколько протоколов, однако в любой Unix-системе для любого сокета всегда указывается протокол по умолчанию. Протокол по умолчанию для виртуального канала - TCP, а для дейтаграммы -UDP.