Чтение онлайн

на главную

Жанры

Основы программирования в Linux
Шрифт:

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

fork
для создания своей второй копии, открытый сокет будет унаследован новым дочерним процессом. Далее он сможет обмениваться данными с подключившимся клиентом, в то время как основной сервер продолжит прием последующих запросов на соединение. В действительности в вашу программу сервера нужно внести очень простое изменение, показанное в упражнении 15.7.

Поскольку вы создаете дочерние процессы, но

не ждете их завершения, следует сделать так, чтобы сервер игнорировал сигналы
SIGCHLD
, препятствуя возникновению процессов-зомби.

Упражнение 15.7. Сервер для многочисленных клиентов

1. Программа server4.c начинается так же, как последний рассмотренный сервер с важным добавлением директивы

include
для заголовочного файла signal.h. Переменные и процедуры создания и именования сокета остались прежними: 

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <netinet/in.h>

#include <signal.h>

#include <unistd.h>

#include <stdlib.h>

int main {

 int server_sockfd, client_sockfd;

 int server_len, client_len;

 struct sockaddr_in server_address;

 struct sockaddr_in client_address;

 server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

 server_address.sin_family = AF_INET;

 server_address.sin_addr.s_addr = htonl(INADDR_ANY);

 server_address.sin_port = htons(9734);

 server_len = sizeof(server_address);

 bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

2. Создайте очередь соединений, игнорируйте подробности завершения дочернего процесса и ждите запросов клиентов:

 listen(server_sockfd, 5);

 signal(SIGCHLD, SIG_IGN);

 while(1) {

char ch;

printf("server waiting\n");

3. Примите запрос на соединение:

client_len = sizeof(client_address);

client_sockfd = accept(server_sockfd,

(struct_sockaddr*)&client_address, &client_len);

4. Вызовите

fork
с целью
создания процесса для данного клиента и выполните проверку, чтобы определить, родитель вы или потомок:

if (fork == 0) {

5. Если вы потомок, то можете читать/писать в программе-клиенте на сокете

client_sockfd
. Пятисекундная задержка нужна для того, чтобы это продемонстрировать:

read(client_sockfd, &ch, 1);

sleep(5);

ch++;

write(client_sockfd, &ch, 1);

close(client_sockfd);

exit(0);

}

6. В противном случае вы должны быть родителем и ваша работа с данным клиентом закончена:

else {

close(client_socket);

}

 }

}

Код включает пятисекундную задержку при обработке запроса клиента для имитации вычислений сервера или обращения к базе данных. Если бы вы проделали это в предыдущем сервере, каждое выполнение программы client3 заняло бы пять секунд. С новым сервером вы сможете обрабатывать множественные клиентские программы client3 параллельно с общим затраченным временем, чуть превышающим пять секунд.

$ ./server4 &

[1] 26566 server waiting

$ ./client3 & ./client3 & ./client3 & ps x

[2] 26581

[3] 26582

[4] 26583

server waiting

server waiting

server waiting

PID TTY STAT TIME COMMAND

26566 pts/1 S 0:00 ./server4

26581 pts/1 S 0:00 ./client3

26582 pts/1 S 0:00 ./client3

26583 pts/1 S 0:00 ./client3

26584 pts/1 R+ 0:00 ps x

26585 pts/1 S 0:00 ./server4

26586 pts/1 S 0:00 ./server4

26587 pts/1 S 0:00 ./server4

$ char from server = В

char from server = В

char from server = В

Поделиться:
Популярные книги

Локки 11. Потомок бога

Решетов Евгений Валерьевич
11. Локки
Фантастика:
героическая фантастика
боевая фантастика
фэнтези
юмористическое фэнтези
5.00
рейтинг книги
Локки 11. Потомок бога

"Новый Михаил-Империя Единства". Компиляцияя. Книги 1-17

Марков-Бабкин Владимир
Избранные циклы фантастических романов
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Новый Михаил-Империя Единства. Компиляцияя. Книги 1-17

На границе империй. Том 9. Часть 5

INDIGO
18. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 5

Эпоха Опустошителя. Том VI

Павлов Вел
6. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том VI

Лекарь Империи 6

Карелин Сергей Витальевич
6. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 6

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Старый, но крепкий 5

Крынов Макс
5. Культивация без насилия
Фантастика:
рпг
аниме
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 5

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

Лекарь Империи 8

Лиманский Александр
8. Лекарь Империи
Фантастика:
попаданцы
городское фэнтези
аниме
5.00
рейтинг книги
Лекарь Империи 8

Мастер 11

Чащин Валерий
11. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 11

Жрец Хаоса. Книга II

Борзых М.
2. Зов пустоты
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Жрец Хаоса. Книга II

Как я строил магическую империю 9

Зубов Константин
9. Как я строил магическую империю
Фантастика:
постапокалипсис
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Как я строил магическую империю 9

Бандит

Щепетнов Евгений Владимирович
1. Петр Синельников
Фантастика:
фэнтези
7.92
рейтинг книги
Бандит

Адвокат Империи 11

Карелин Сергей Витальевич
Адвокат империи
Фантастика:
городское фэнтези
альтернативная история
рпг
дорама
попаданцы
5.00
рейтинг книги
Адвокат Империи 11