Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторний_прак_СПЗ.doc
Скачиваний:
3
Добавлен:
03.05.2019
Размер:
424.45 Кб
Скачать

2 Порядок виконання роботи

1 Підімкніться до комп’ютера під керуванням ОС UNIX за допомогою telnet (“Пуск\Виконати\telnet ip”, де ip — адреса машини під керуванням UNIX).

2 Після підімкнення введіть ім’я (login) та пароль (password).

3 Створіть текстові файли serverfifo.c та clientfifo.c у редакторі ее.

Для цього треба набрати:

ee serverfifo.c на першому терміналі

ee clientfifo.c на другому терміналі

Для збереження треба натиснути Esc + Enter.

Вихідні тексти цих файлів наступний:

socketserver:

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#define MAXBUF 256

#define FILE "echo.serv"

char buf[MAXBUF];

main()

{

struct sockaddr_un serv_addr, clnt_addr;

int sockfd;

int saddrlen, caddrlen, max_caddrlen, n;

if((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0){

printf("Nemozhlyvo stvoryty socket\n");

exit(1);

}

unlink(FILE);

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sun_family = AF_UNIX;

strcpy(serv_addr.sun_path, FILE);

saddrlen=sizeof(serv_addr.sun_family)+strlen(serv_addr.sun_path);

if(bind(sockfd, (struct sockaddr*)&serv_addr, saddrlen) < 0){

printf("Pomylka svyazuvannya socketa z adresoyu\n");

exit(1);

}

max_caddrlen = sizeof(clnt_addr);

for(;;){

caddrlen = max_caddrlen;

n = recvfrom(sockfd, buf, MAXBUF, 0, (struct sockaddr*)&clnt_addr, &caddrlen);

if(n < 0){

printf("Pomylka pryjmannya\n");

exit(1);

}

if(sendto(sockfd, buf, n, 0, (struct sockaddr*)&clnt_addr, caddrlen) !=n){

printf("Pomylka peredavannya\n");

exit(1);

}

}

}

socketclient:

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <errno.h>

#define MAXBUF 256

#define FILE "echo.serv"

#define NULL 0

char *msg = "Hello world!";

char buf[MAXBUF];

main()

{

struct sockaddr_un serv_addr, clnt_addr;

int sockfd;

int saddrlen, caddrlen, msglen, n;

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sun_family = AF_UNIX;

strcpy(serv_addr.sun_path, FILE);

saddrlen=sizeof(serv_addr.sun_family)+strlen(serv_addr.sun_path);

if((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0){

printf("Nemozhlyvo stvoryty' socket\n");

exit(1);

}

bzero(&clnt_addr, sizeof(clnt_addr));

clnt_addr.sun_family = AF_UNIX;

strcpy(clnt_addr.sun_path, FILE);

mktemp(clnt_addr.sun_path);

caddrlen=sizeof(clnt_addr.sun_family)+strlen(clnt_addr.sun_path);

if(bind(sockfd, (struct sockaddr*)&clnt_addr, caddrlen) < 0){

printf("Pomylka svyazuvannya socketa\n");

exit(1);

}

msglen = strlen(msg);

if(sendto(sockfd, msg, msglen, 0, (struct sockaddr*)&serv_addr, saddrlen) != msglen){

printf("Pomylka peredavannya povidomlennya\n");

exit(1);

}

if((n = recvfrom(sockfd, buf, MAXBUF, 0, NULL, 0)) < 0){

printf("Pomylka otrymannya povidomlennya\n");

exit(1);

}

printf("Echo: %s\n", buf);

close(sockfd);

unlink(clnt_addr.sun_path);

exit(0);

}

4 Відкомпілюйте програми:

cc -o serverfifo serverfifo.c

cc -o clientfifo clientfifo.c

5 У разі успішної компілювання на першому терміналі командою ls -1 можна спостерігати з’явлення виконуваного файла ./serverfifo, а на другому — ./clientfifo.

6 Перевірте результати роботи програм; у разі з’явлення повідомлень про помилки, поясніть їх та усуньте, після чого знову запустіть програми та отримайте позитивний результат — з’явлення на терміналі сервера Ваших прізвища, ім’я та по-батькові.

7 Змоделюйте ситуації, коли неможливо створити, відкрити та вилучити FIFO, а також коли виникає помилка виведення та записування, потім знову налаштуйте програми та виконайте їх.