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

на главную - закладки

Жанры

Основы программирования в 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 = В

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

Кодекс Охотника. Книга XXVI

Винокуров Юрий
26. Кодекс Охотника
Фантастика:
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXVI

Кодекс Императора

Сапфир Олег
1. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
4.25
рейтинг книги
Кодекс Императора

Наследник 2

Шимохин Дмитрий
2. Старицкий
Фантастика:
попаданцы
альтернативная история
фэнтези
5.75
рейтинг книги
Наследник 2

Наследие Маозари 2

Панежин Евгений
2. Наследие Маозари
Фантастика:
попаданцы
рпг
аниме
5.00
рейтинг книги
Наследие Маозари 2

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Офицер

Земляной Андрей Борисович
1. Офицер
Фантастика:
боевая фантастика
7.21
рейтинг книги
Офицер

Первый среди равных. Книга V

Бор Жорж
5. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга V

Меченный смертью. Том 1

Юрич Валерий
1. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Меченный смертью. Том 1

В лапах зверя

Зайцева Мария
1. Звериные повадки Симоновых
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
В лапах зверя

Наша навсегда

Зайцева Мария
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Наша навсегда

Ваше Сиятельство 9

Моури Эрли
9. Ваше Сиятельство
Фантастика:
боевая фантастика
попаданцы
стимпанк
аниме
фэнтези
5.00
рейтинг книги
Ваше Сиятельство 9

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

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

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