Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
615 из 715
Затем с помощью функции listen устанавливается длина очереди поступающих сообщений и начинается цикл ожидания поступления запросов. Функция accept приостанавливает свое выполнение до тех пор, пока протоколом не будет зарегистрирован запрос на подключение к гнезду с означенным именем; после этого функция завершается, возвращая поступившему запросу новый дескриптор гнезда. Процесс-сервер порождает потомка, через которого будет поддерживаться связь с процессом-клиентом; родитель и потомок при этом закрывают свои дескрипторы, чтобы они не становились помехой для коммуникационного траффика другого процесса. Процесс-потомок ведет разговор с клиентом и завершается после выхода из функции read. Процесс-сервер возвращается к началу цикла и ждет поступления следующего запроса на подключение.
#include ‹sys/types.h›
#include ‹sys/socket.h›
main() {
int sd, ns;
char buf[256];
struct sockaddr sockaddr;
int fromlen;
sd = socket(AF_UNIX, SOCK_STREAM, 0);
/* имя гнезда — не может включать пустой символ */
bind(sd, "sockname", sizeof("sockname") - 1);
listen(sd, 1);
for (;;) {
ns = accept(sd, &sockaddr, &fromlen);
if (fork() == 0) { /* потомок */
close(sd);
read(ns, buf, sizeof(buf));
printf("сервер читает %s'\n",buf);
exit();
}
close(ns);
}
}
Рисунок 11.20. Процесс-сервер в домене "UNIX system"
#include ‹sys/types.h›
#include ‹sys/socket.h›
main() {
int sd, ns;
char buf[256];
struct sockaddr sockaddr;
int fromlen;
sd = socket(AF_UNIX, SOCK_STREAM, 0);
/* имя в запросе на подключение не может включать пуст�
|< Пред. 613 614 615 616 617 След. >|