
- •Лабораторна робота № 15 взаємодія процесів в ос unix за допомогою іменованих каналів
- •1 Мета роботи
- •2 Основні положення
- •2.1 Способи забезпечення взаємодії процесів в ос unix
- •2.2 Взаємодія поміж процесами за допомогою іменованих каналів
- •2.3 Функції та системні виклики ос unix,
- •3 Контрольні запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •6 Зміст протоколу
- •7 Список рекомендованої літератури
- •Взаємодія процесів в ос unix за допомогою інтерфейсу сокетів
- •1 Мета роботи
- •2 Основні положення
- •2.1 Загальні вимоги до міжпроцесної взаємодії
- •2.2 Програмний інтерфейс сокетів
- •2.3 Приклад використання сокета
- •3 Контрольні запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •6 Зміст протоколу
- •3 Контрольні запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •6 Зміст протоколу
- •7 Список рекомендованої літератури
- •Лабораторна робота № 18
- •2.1 Утиліта ping
- •2.2 Програма traceroute
- •2.3 Програма ttcp
- •2.4 Програма tcpdump
- •2.5 Програма netstat
- •3 Контрольні запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •6 Зміст протоколу
- •7 Список рекомендованої літератури
- •Створення системи обліку трафіка
- •1 Мета роботи
- •2 Ключові положення
- •2.1 Принципи обліку трафіка
- •2.2 Мова програмування Shell
- •2.2.1 Структура команд
- •2.2.2. Структура команд
- •2.2.3 Групування команд
- •2.2.4 Переспрямовування команд
- •2.3 Брандмауер firewall
- •2.3.1 Можливості ipfw
- •2.3.2 Формат правил ipfw
- •2.4 Мова програмування awk
- •3 Контрольні запитання
- •4 Домашнє завдання
- •5 Лабораторне завдання
- •6 Зміст протоколу
- •7 Список рекомендованої літератури
- •Тексти програм serverfifo та clientfifo
- •Тексти програм socketserver та socketclient
- •Тексти програм servertcp та clienttcp
- •Тексти програм simpletcpserv та simpletcpclient
- •Лістинг програми обліку трафіку
Тексти програм servertcp та clienttcp
Лістинг 1
servertcp:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <fcntl.h>
#include <netdb.h>
#include <errno.h>
/*Номер порту сервера, відомий клієнтам*/
#define PORTNUM 1500
int main(int argc, char* argv[])
{
int s, ns, pid, nport;
struct sockaddr_in serv_addr, clnt_addr;
struct hostent *hp;
char buf[80], hname[80];
/*Перетворімо порядок слідування байтів на мережний формат*/
nport = PORTNUM;
nport = htons((u_short)nport);
/*Створімо сокет, який використовує протокол ТСР*/
if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("Pomylka vyklyku socket()");
exit(1);
}
/*Задамо адресу комунікаційного вузла*/
bzero(&serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = nport;
/*Зв'яжемо сокет з цією адресою*/
if(bind(s, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1){
perror("Pomylka vyklyku bind()");
exit(1);
}
/*Передамо повідомлення із зазначенням адреси сервера*/
fprintf(stderr, "Server gotov: %s\n", inet_ntoa(serv_addr.sin_addr));
/*Сервер готовий приймати запити на встановлення з'єднання. Максимальна кількість запитів, які очікують на опрацювання - 5. Як правило, цієї кількості вистачає, щоби встигнути виконати ассерt(2) та породити дочірній процес*/
if(listen(s, 5) == -1){
perror("Pomylka vyklyku listen()");
exit(1);
}
/*Нескінченний цикл отримування запитів та їхнього опрацьовування*/
while(1){
int addrlen;
bzero(&clnt_addr, sizeof(clnt_addr));
addrlen = sizeof(clnt_addr);
/*Приймемо запит. Новий сокет ns стає комунікаційним вузлом створеного віртуального каналу*/
if((ns = accept(s, (struct sockaddr*) &clnt_addr, &addrlen)) ==
-1){
perror("Pomylka vyklyku accept()");
exit(1);
}
/*Виведемо інформацію про клієнта*/
fprintf(stderr, "Client = %s\n", inet_ntoa(clnt_addr.sin_addr));
if((pid = fork()) == -1){
perror("Pomylka vyklyku fork()");
exit(1);
}
if(pid == 0){
int nbytes, fout;
/*Дочірній процес: цей сокет нам не потрібен. Він використовується, як і раніше, для отримання запитів*/
close(s);
/*Отримаємо повідомлення від клієнта й повернемо його назад*/
while((nbytes = recv(ns, buf, sizeof(buf), 0)) != 0){
send(ns, buf, sizeof(buf), 0);
}
close(ns);
exit(0);
}
/*Батьківський процес: цей сокет нам не потрібен. Він використовується дочірнім процесом для обміну даними*/
close(ns);
}
}
Лістинг 2
clienttcp:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <fcntl.h>
#include <netdb.h>
#include <errno.h>
/*Номер порту, який обслуговується сервером*/
#define PORTNUM 1500
int main(int argc, char* argv[])
{
int s, pid, i, j;
struct sockaddr_in serv_addr;
struct hostent *hp;
char buf[80] = "Hello, World!\n";
/*Клієнтові як аргумент передається доменне ім'я хоста, на якому запущено сервер. Доменне ім'я транслюється у адресу*/
if((hp = gethostbyname(argv[1])) == 0)
{
perror("Pomylka vyklyku gethostbyname()");
exit(3);
}
bzero(&serv_addr, sizeof(serv_addr));
bcopy(hp->h_addr, &serv_addr.sin_addr, hp->h_length);
serv_addr.sin_family = hp->h_addrtype;
serv_addr.sin_port = htons(PORTNUM);
/*Створімо сокет*/.
if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("Pomylka vyklyku socket()");
exit(1);
}
fprintf(stderr, "Addresa clienta: %s\n", inet_ntoa(serv_addr.sin_addr));
/*Створімо віртуальний канал*/
if(connect(s, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) ==
-1){
perror("Pomylka vyklyku connect()");
exit(1);
}
/*Передамо серверові повідомлення й отримаємо його назад*/
send(s, buf, sizeof(buf), 0);
if(recv(s, buf, sizeof(buf), 0) < 0){
perror("Pomylka vyklyku recv()");
exit(1);
}
/*Виведемо отримане повідомлення на екран*/
printf("Otrymano vid servera: %s\n", buf);
close(s);
printf("Client zavershyv robotu \n\n");
}
ДОДАТОК Г