Составители:
Рубрика:
int close(int fd);
Вместо дескриптора файла (fd) может быть указан дескриптор сокета (sd) — работа функции от этого не
изменится. В случае успешного завершения возвращается значение 0.
Всегда закрывайте сокеты
Возьмите за правило явно закрывать дескрипторы, особенно сокетов. По умолчанию при завершении
программы операционная система закрывает все открытые дескрипторы и "выталкивает" содержи-
мое буферов. Если дескриптор связан с файлом, все проходит незаметно. В случае сокета процесс мо-
жет затянуться, в результате ресурсы останутся занятыми и другим клиентам будет сложнее под-
ключиться
к сети.
Функция close () возвращает всего один код ошибки.
•EBADF.
Указан неверный дескриптор файла.
Функция shutdown () позволяет лучше управлять процессом разрыва соединения, поскольку мо-
жет закрывать отдельно входные и выходные каналы. Эта функция особенно полезна, когда сокет заме-
щает стандартные потоки stdin и stdout.
Путаница с именем shutdown
Функция shutdown () отличается от команды shutdown (см. раздел 8 интерактивного справочного руко-
водства по UNIX), которая завершает работу операционной системы.
С помощью функции shutdown () можно закрыть канал в одном направлении, сделав его доступ-
ным только для чтения или только для записи:
#include <sys/socket.h>
int shutdown(int s, int how);
Параметр how может принимать три значения.
Значение Выполняемое действие
0 Закрыть канал чтения
1 Закрыть канал записи
2 Закрыть оба канала
Резюме: что происходит за кулисами
Когда программа создает сокет и подключается к TCP-серверу, происходит целый ряд действий.
Сам по себе сокет организует лишь очередь сообщений. Основной процесс начинается при подключе-
нии. Ниже поэтапно расписано, что происходит на стороне клиента и сервера (Таблица 2).
Таблица 2 Действия, выполняемые при создании сокета и подключении к серверу
Действия клиента Действия сервера
1. Вызов функции socket (): соз-
дание очереди сообщений, ус-
тановка флагов протокола
(Ожидание подключения)
2. Вызов функции connect ():
операционная система назнача-
ет сокету порт, если он не был
назначен с помощью функции
bind ()
(Ожидание)
3. Отправка сообщения, в кото-
ром запрашивается установле-
ние соединения и сообщается
номер порта
(Ожидание ответа сервера) 4. Помещение запроса в очередь порта
(Ожидание) 5. Чтение данных из очереди, прием запроса и создание уникального
канала для сокета
(Ожидание) 6. Создание (иногда) уникального задания или потока для взаимо-
действия с программой
(Ожидание) 7. Отправка подтверждения о том, что соединение установлено. Сервер
либо посылает сообщение по указанному порту, либо ожидает запроса
от программы. После передачи данных сервер может закрыть канал,
если он выдает только односторонние сообщения (например, сообщает
int close(int fd); Вместо дескриптора файла (fd) может быть указан дескриптор сокета (sd) — работа функции от этого не изменится. В случае успешного завершения возвращается значение 0. Всегда закрывайте сокеты Возьмите за правило явно закрывать дескрипторы, особенно сокетов. По умолчанию при завершении программы операционная система закрывает все открытые дескрипторы и "выталкивает" содержи- мое буферов. Если дескриптор связан с файлом, все проходит незаметно. В случае сокета процесс мо- жет затянуться, в результате ресурсы останутся занятыми и другим клиентам будет сложнее под- ключиться к сети. Функция close () возвращает всего один код ошибки. •EBADF. Указан неверный дескриптор файла. Функция shutdown () позволяет лучше управлять процессом разрыва соединения, поскольку мо- жет закрывать отдельно входные и выходные каналы. Эта функция особенно полезна, когда сокет заме- щает стандартные потоки stdin и stdout. Путаница с именем shutdown Функция shutdown () отличается от команды shutdown (см. раздел 8 интерактивного справочного руко- водства по UNIX), которая завершает работу операционной системы. С помощью функции shutdown () можно закрыть канал в одном направлении, сделав его доступ- ным только для чтения или только для записи: #includeint shutdown(int s, int how); Параметр how может принимать три значения. Значение Выполняемое действие 0 Закрыть канал чтения 1 Закрыть канал записи 2 Закрыть оба канала Резюме: что происходит за кулисами Когда программа создает сокет и подключается к TCP-серверу, происходит целый ряд действий. Сам по себе сокет организует лишь очередь сообщений. Основной процесс начинается при подключе- нии. Ниже поэтапно расписано, что происходит на стороне клиента и сервера (Таблица 2). Таблица 2 Действия, выполняемые при создании сокета и подключении к серверу Действия клиента Действия сервера 1. Вызов функции socket (): соз-(Ожидание подключения) дание очереди сообщений, ус- тановка флагов протокола 2. Вызов функции connect ():(Ожидание) операционная система назнача- ет сокету порт, если он не был назначен с помощью функции bind () 3. Отправка сообщения, в кото- ром запрашивается установле- ние соединения и сообщается номер порта (Ожидание ответа сервера) 4. Помещение запроса в очередь порта (Ожидание) 5. Чтение данных из очереди, прием запроса и создание уникального канала для сокета (Ожидание) 6. Создание (иногда) уникального задания или потока для взаимо- действия с программой (Ожидание) 7. Отправка подтверждения о том, что соединение установлено. Сервер либо посылает сообщение по указанному порту, либо ожидает запроса от программы. После передачи данных сервер может закрыть канал, если он выдает только односторонние сообщения (например, сообщает
Страницы
- « первая
- ‹ предыдущая
- …
- 9
- 10
- 11
- 12
- 13
- …
- следующая ›
- последняя »