Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
19
Добавлен:
05.06.2015
Размер:
38.4 Кб
Скачать

Міністерство освіти і науки, молоді та спорту України

Кіровоградський національний технічний університет

МТФ

Кафедра Програмного забезпечення

Дисципліна Обчислювальні системи

Лабораторна робота №2

Тема:" Створення мерережної взаємодії за допомогою сокетів в середовищі ОС Linux"

Виконав ст. гр. КІ-09-2

Кірнус Л.Є.

Перевірив викладач

Доренський О.П.

Кіровоград 2012

Завдання до лабораторної роботи:

1.Запустіть наведені програми сервер та декілька клієнтських процесів. Виясніть, що трапиться після того, як усі клієнтські процеси завершаться?

2.Змініть програму так, щоб після того як усі клієнтські процеси завершать свою роботу, сервер також завершив роботу після заданого проміжку часу, якщо не надійдуть нові запити на з'єднання.

3.Змініть код програми так, щоб два процеси, що взаємодіють, виконувалися на одному й тому ж комп'ютері. У цьому випадку сокет повинен мати комутаційний домен AF_UNIX.

/* Серверний процес */

#include <ctype.h>

#include <sys/types.h>

#include <sys/socet.h>

#include <netinet/in.h>

#include <signal.h>

#define SIZE sizeof(struct sokaddr_in)

void catcher(int sig);

int newsockfd;

main()

{

int sockfd;

char c;

struct sockaddr_in server = (PF_INET, 7000, INADDR_ANY);

static struct sigaction act;

act.sa_handler = catcher;

sigfilleset(&(act.sa_mask));

sigaction(SIGPIPE, &act, NULL);

/* Створюємо сокет*/

if (( sockfd = soket(PF_INET, SOCK_STREAM, 0)) == -1

{

perror(" Помилка виклику socket ");

exit (1);

}

/* Зв'язує адресу з сокетом */

if (bind(sockfd, (struct socaddr*)&server, SIZE) == -1)

{

perror(" Помилка виклику bind");

exit (1);

}

/* Включає прийом з'єднань */

if (listen(sockfd, 5) = = -1)

{

perror("Помилка виклику listen");

exit(1);

}

for ( ; ; )

{

/* Приймаємо запит на з'єднання */

if ((newsockfd = accept(sockfd, NULL, NULL)) ==-1)

{

perror("Помилка виклику accept");

continue;

}

/* Створює дочірній процес для роботи з з'єднанням */

if (fork() ==)

{

while(recv(newsockfd, &c, 1, 0) > 0)

{

c = toupper(c);

send(newsockfd, &c, 1, 0)

}

/* Після того, як клієнт перестав передавати дані сокет може бути закритим і дочірній процес завершує роботу */

close (newsockfd);

exit (0);

}

/* У батьківському процесі newsockfd не потрібен */

close (newsockfd);

}

}

void catcher(int sig)

{

close(newsockfd);

exit(0);

}

/* Клієнтський процес*/

#include <ctype.h>

#include <sys/types.h>

#include <netinet/in.h>

#define SIZE sizeof(struct sockaddr_in)

int main(void)

{

int sockfd;

char c, rc;

struct sockaddr_in server = (PF_INET, 7000);

/* Перетворює та зберігає IP адресу сервера */

server.sun_addr.s_addr = inet_addr("10.5.5.28");

/* Створення сокету */

if ((sockfd = soket(PF_INET, SOCK_STREAM, 0) == -1)

{

perror(" Помилка виклику socket");

exit(1);

}

/* З'єднує сокет з сервером */

if (connect(sockfd, (sockfd,(struct sockaddr* ) &server, SIZE) ==-1)

{

perror("Помилка виклику connect");

exit (1);

}

/* Цикл обміну даними з серврером */

for (rc = '\n'; ;)

{

if (rc = ='\n');

printf("Введіть рядковий символ \n");

c = getchar();

send(socfd, &c, 1, 0);

if (recv(sockfd, &rc, 1, 0) > 0)

printf("%c", rc);

else;

{

printf(" Сервер відповідає \n ");

close(sockfd);

exit (1);

}

}

}

Соседние файлы в папке Вычислительные системы