66497

Механизмы сетевого взаимодействия

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы – изучить программный интерфейс сетевых сокетов, получить навыки организации взаимодействия программ при помощи протоколов Internet и разработки прикладных сетевых сервисов.

Русский

2014-08-22

39.5 KB

1 чел.

Министерство образования и науки Российской Федерации

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

Факультет технической кибернетики

Кафедра «Информационная безопасность компьютерных систем»

ЛАБОРАТОРНАЯ РАБОТА № 8

Механизмы сетевого взаимодействия

по дисциплине «Операционные системы»

Выполнил

студент гр. 2088/1  А.С. Никитин

 <подпись>

Руководитель

 Т.В. Степанова

 <подпись>

Санкт-Петербург

2011

1. Формулировка задания

Цель работы – изучить программный интерфейс сетевых сокетов, получить навыки организации взаимодействия программ при помощи протоколов Internet и разработки прикладных сетевых сервисов.

2. Использованные теоретические сведения

3. Результаты работы

3.1. Выполнение индивидуального задания

Разработать на языке C программу transport, демонстрирующую использование основных функций работы с сокетами UNIX. Программа должна порождать четыре процесса — клиент общается с сервером, который является клиентом для двух других серверов, которые выполняют однонаправленную передачу данных между собой через TCP cокеты,  относящиеся к локальному сетевому интерфейсу lo.

При помощи программы transport оценить скорость передачи данных через стек протоколов TCP/IP при использовании протокола TCP.
#include <sys/types.h>

#include <sys/socket.h>

#include <linux/in.h>

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <assert.h>

#include <time.h>

#define BUFSIZE    32

#define TIMES      1048576

#define IP         "127.0.0.1"

#define PORT_C_CS  12124

#define PORT_CS_S1 12235

#define PORT_CS_S2 13151

int server2() {

   int fdsocket, fdnsocket, bcount, i;

   char buffer[BUFSIZE];

   struct sockaddr_in ssocket, csocket;

   long int t;

   double s;

   assert((fdsocket = socket(AF_INET, SOCK_STREAM, 0)) >= 0);

   ssocket.sin_family = AF_INET;

   ssocket.sin_port = htons(PORT_CS_S2);

   ssocket.sin_addr.s_addr = htonl(INADDR_ANY);

   assert(bind(fdsocket, (struct sockaddr *) &ssocket, sizeof(ssocket)) >= 0);

   assert(listen(fdsocket, 16) >= 0);

   bcount = sizeof(csocket);

   assert((fdnsocket = accept(fdsocket, (struct sockaddr *) &csocket, &bcount)) >= 0);

   t = clock();

   for (i = 0; i < TIMES; i++) read(fdnsocket, buffer, BUFSIZE);

   t = clock() - t;

   s = (double) t / (double) CLOCKS_PER_SEC;

   printf("S2: C to S2 speed: %lf\n", (double) BUFSIZE / s);

   close(fdnsocket);

   close(fdsocket);

   return 0;

}

int server1() {

   int fdsocket, fdnsocket, bcount, i;

   char buffer[BUFSIZE];

   struct sockaddr_in ssocket, csocket;

   long int t;

   double s;

   assert((fdsocket = socket(AF_INET, SOCK_STREAM, 0)) >= 0);

   ssocket.sin_family = AF_INET;

   ssocket.sin_port = htons(PORT_CS_S1);

   ssocket.sin_addr.s_addr = htonl(INADDR_ANY);

   assert(bind(fdsocket, (struct sockaddr *) &ssocket, sizeof(ssocket)) >= 0);

   assert(listen(fdsocket, 16) >= 0);

   bcount = sizeof(csocket);

   assert((fdnsocket = accept(fdsocket, (struct sockaddr *) &csocket, &bcount)) >= 0);

   t = clock();

   for (i = 0; i < TIMES; i++) read(fdnsocket, buffer, BUFSIZE);

   t = clock() - t;

   s = (double) t / (double) CLOCKS_PER_SEC;

   printf("S1: C to S1 speed: %lf\n", (double) BUFSIZE / s);

   close(fdnsocket);

   close(fdsocket);

   return 0;

}

int clientserver() {

   int fdsocket, fds1socket, fds2socket, fdcsocket, bcount, i;

   char buffer[BUFSIZE];

   struct sockaddr_in ssocket, s1socket, s2socket, csocket;

   long int t;

   double s;

   assert((fds1socket = socket(AF_INET, SOCK_STREAM, 0)) >= 0);

   s1socket.sin_family = AF_INET;

   s1socket.sin_port = htons(PORT_CS_S1);

   inet_aton(IP, &s1socket.sin_addr);

   assert((fds2socket = socket(AF_INET, SOCK_STREAM, 0)) >= 0);

   s2socket.sin_family = AF_INET;

   s2socket.sin_port = htons(PORT_CS_S2);

   inet_aton(IP, &s2socket.sin_addr);

   assert((fdsocket = socket(AF_INET, SOCK_STREAM, 0)) >= 0);

   ssocket.sin_family = AF_INET;

   ssocket.sin_port = htons(PORT_C_CS);

   ssocket.sin_addr.s_addr = htonl(INADDR_ANY);

   assert(bind(fdsocket, (struct sockaddr *) &ssocket, sizeof(ssocket)) >= 0);

   assert(listen(fdsocket, 16) >= 0);

   bcount = sizeof(csocket);

   while (connect(fds1socket, (struct sockaddr *) &s1socket, sizeof(s1socket)) < 0);

   while (connect(fds2socket, (struct sockaddr *) &s2socket, sizeof(s2socket)) < 0);

   assert((fdcsocket = accept(fdsocket, (struct sockaddr *) &csocket, &bcount)) >= 0);

   t = clock();

   for (i = 0; i < TIMES; i++) {

       read(fdcsocket, buffer, BUFSIZE);

       write(fds1socket, buffer, BUFSIZE);

       write(fds2socket, buffer, BUFSIZE);

   }

   t = clock() - t;

   s = (double) t / (double) CLOCKS_PER_SEC;

   printf("CS: CS speed: %lf\n", (double) (BUFSIZE * 3) / s);

   close(fds1socket);

   close(fds2socket);

   close(fdcsocket);

   close(fdsocket);

   return 0;

}

int client() {

   int fdsocket, bcount, i;

   char buffer[BUFSIZE];

   struct sockaddr_in ssocket;

   assert((fdsocket = socket(AF_INET, SOCK_STREAM, 0)) >= 0);

   ssocket.sin_family = AF_INET;

   ssocket.sin_port = htons(PORT_C_CS);

   inet_aton(IP, &ssocket.sin_addr);

   while (connect(fdsocket, (struct sockaddr *) &ssocket, sizeof(ssocket)) < 0);

   for (i = 0; i < TIMES; i++) write(fdsocket, buffer, BUFSIZE);

   close(fdsocket);

   return 0;

}

int main() {

   int pcl;

   if (pcl = fork()) {

       client();

       wait(pcl);

       return 0;

   }

   if (pcl = fork()) {

       clientserver();

       wait(pcl);

       return 0;

   }

   if (pcl = fork()) {

       server1();

       wait(pcl);

       return 0;

   }

   server2();

   return 0;

}

4. Выводы

Сетевые сокеты предоставляют удобный интерфейс взаимодействия программ, находящихся как на одном компьютере, так и на разных, при условии нахождения их в одной сети.


Приложение

Исходные тексты программ


 

А также другие работы, которые могут Вас заинтересовать

20458. Основні задачі та проблеми проектування програмних продуктів 13.41 KB
  Пр428 Основні задачі та проблеми проектування програмних продуктів. Проектування це процес розробки проекту тобто комплекту документації призначену для створення проекту його удосконалення та ліквідації а також для перевірки або відтворення проміжних і кінцевих рішень. Проектування тривалий процес і включає етапи від підготовки технічного завдання до випробування. Процес створення програмного забезпечення ПЗ також включає в себе методи проектування.
20459. Каскадна (послідовна) модель 22.61 KB
  Вона передбачає послідовне виконання всіх етапів проекту в строго фіксованому порядку. Вимоги визначені на стадії формування вимог строго документуються у вигляді технічного завдання і фіксуються на весь час розробки проекту. Етапи проекту відповідно до каскадної моделлю: Формування вимог; Проектування; Реалізація; Тестування; Впровадження; Експлуатація та супровід. Недоліки: В Водоспадної моделі перехід від однієї фази проекту до іншого передбачає повну коректність результату виходу попередньої фази.
20460. Доповнення та різниця множин 18.86 KB
  Якщо A ⊂ U то елементи множини U які не належать А називаються доповненням множини А до множини U і позначають як CUA або UCA. Якщо A ⊂ U B ⊂ U то доповнення множини B до А називають різницею множин А та B саме в такому порядку і позначають А B або АB тобто A B = {x:x ∈ A ∧ x ∉ B}. Деякі властивості операції доповнення: A ∪ A′ = U A ∩ A′ = ∅ A′′ = A A − B = A ∩ B′ Об'єднання множин Об'єднанням множин А та B називається множина яка складається з усіх тих елементів які належать хоча б одній з множин A B: A ∪ B = {x: x ∈ A ∨ A...
20461. Життєвий цикл програмного забезпечення 58.5 KB
  Проектування: визначення структури системи та її проектуваннярозбиття програмної системи на окремі компоненти та проектування з визначенням ключових елементів структури даних. Тестування і верифікація: тестування вихідного текста;участь користувачів і колективів у всіх перевірках системи. Експлуатація і супроводження:використання готової програмної системи; оцінка її ефективності;усунення знайдених в процесі експлуатації помилок; внесення необхідних змін для підтримки актуальності програмної системи;д перевірка коректності внесених змін .
20462. Расчет характеристик вычислительных систем на основе стохастических сетей 239.66 KB
  В данной работе определяются характеристики вычислительной системы, модель замкнутой стохастической сети которой... Исходными данными для расчета являются следующие величины:
20463. Бу́лева фу́нкція (функція алгебри логіки, логічна функція) 22.02 KB
  Булева функція задається у вигляді таблиці або графіка зі стандартним лексикографічним розташуванням наборів аргументів. Нульарними булевими функціями є сталі 0 і 1. Функції 0 і 1 називаються тотожними нулем і одиницею функція x тотожною запереченням.
20464. CASE модель 14.28 KB
  Також під CASE розуміють сукупність методів і засобів проектування інформаційних систем з інтегрованими автоматизованими інструментами які можуть бути використані в процесі розробки ПЗ. У функції CASE входять засоби аналізу проектування й програмування. За допомогою CASE автоматизують процеси проектування інтерфейсів документування й генерування структурованого коду бажаною мовою програмування.
20465. Етапи проектування програмних продуктів 24.5 KB
  Немає універсальної технології розробки програм але більшість запропонованих технологій мають спільні риси адже обєкт праці програмний продукт відрізняється продуктовою однаковістю одним рівнем розвитку обчислювальної техніки та самої галузі програмування. Розробка програми на основі наперед підготовлених компонентів технологія збірного програмування є засобом переведення програмування на індустріальну основу зменшення складності програмування реальних задач продовження терміну використання окремих передових рішень що реалізовані в...
20466. Компонентне програмування 16.45 KB
  Таким чином компонентне програмування обходить проблему крихкості базового класу.Компонентноорієнтоване програмування включає в себе набір обмежень що накладаються на механізм об'єктноорієнтованого програмування далі ООП.Ситуація коли виникає нова парадигма програмування як обмеження колишньої вже була коли виникло структурне програмування для використання структур управління які виключають невпорядковані переходи управління за допомогою оператора GOTO що утрудняють аналіз алгоритму програми.