next up previous contents index
Next: Примеры Up: Работа с сокетами Previous: Функция shutdown   Contents   Index

Функция close

Эта функция закрывает сокет и разрывает все соединения с этим сокетом. В отличие от функции shutdown функция close.может дожидаться окончания всех операций с сокетом, обеспечивая "нормальное", а не аварийное закрытие соединений.

Прототип:

int close (int s);

Аргумент функции - закрываемый сокет-дескриптор.

Пример-оболочка программы "Клиент" #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #define ADDRESS "mysocket" /* адрес для связи */ void main () { char c; int i, s, len; FILE *fp; struct sockaddr_un sa; /* получаем свой сокет-дескриптор: */ if ((s = socket (AF_UNIX, SOCK_STREAM, 0))<0) { perror ("client: socket"); exit(1); } /* создаем адрес, по которому будем связываться с сервером: */ sa.sun_family = AF_UNIX; strcpy (sa.sun_path, ADDRESS); /* пытаемся связаться с сервером: */ len = sizeof ( sa.sun_family) + strlen ( sa.sun_path); if ( connect ( s, &sa, len) < 0 ){ perror ("client: connect"); exit (1); } /*--------------------------------------------- */ /* читаем сообщения сервера */ fp = fdopen (s, "r"); c = fgetc (fp); /* обрабатываем информацию от сервера ................................... */ /* посылаем ответ серверу */ send (s, "client", 7, 0); /* продолжаем диалог с сервером, пока в этом есть необходимость ............................ */ /* завершаем сеанс работы */ close (s); exit (0); }

Пример-оболочка программы "Сервер" #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #define ADDRESS "mysocket" /* адрес для связи */ void main () { char c; int i, d, d1, len, ca_len; FILE *fp; struct sockaddr_un sa, ca; /* получаем свой сокет-дескриптор: */ if((d = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) { perror ("client: socket"); exit (1); } /* создаем адрес, c которым будут связываться клиенты */ sa.sun_family = AF_UNIX; strcpy (sa.sun_path, ADDRESS); /* связываем адрес с сокетом; уничтожаем файл с именем ADDRESS, если он существует, для того, чтобы вызов bind завершился успешно */ unlink (ADDRESS); len = sizeof ( sa.sun_family) + strlen (sa.sun_path); if ( bind ( d, &sa, len) < 0 ) { perror ("server: bind"); exit (1); } /* слушаем запросы на сокет */ if ( listen ( d, 5) < 0 ) { perror ("server: listen"); exit (1); } /* связываемся с клиентом через неименованный сокет с дескриптором d1: */ if (( d1 = accept ( d, &ca, &ca_len)) < 0 ) { perror ("server: accept"); exit (1); } /* ------------------------------------------ */ /* пишем клиенту: */ send (d1, "server", 7, 0); /* читаем запрос клиента */ fp = fdopen (d1, "r"); c = fgetc (fp); /* ................................ */ /* обрабатываем запрос клиента, посылаем ответ и т.д. ........................... */ /* завершаем сеанс работы */ close (d1); exit (0); }



Alex Otwagin 2002-12-16