Функция shutdown закрывает гнездовую связь:
Функция shutdown закрывает гнездовую связь: shutdown(sd,mode)
где mode указывает, какой из сторон (посылающей, принимающей или обеим вместе) отныне запрещено участие в процессе передачи данных. Функция сообщает используемому протоколу о завершении сеанса сетевого взаимодействия, оставляя, тем не менее, дескрипторы гнезд в неприкосновенности. Освобождается дескриптор гнезда только в результате выполнения функции close.
Системная функция getsockname получает имя гнездовой связи, установленной ранее с помощью функции bind: getsockname(sd,name,length);
Функции getsockopt и setsockopt получают и устанавливают значения различных связанных с гнездом параметров в соответствии с типом домена и протокола.
Рассмотрим обслуживающую программу, представленную на Рисунке 11.20. Процесс создает в домене "UNIX system" гнездо потокового типа и присваивает ему имя sockname. Затем с помощью функции 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); } } |
Содержание Назад Вперед