Поделиться через


Функция closesocket (winsock.h)

Функция closesocket закрывает существующий сокет.

Синтаксис

int closesocket(
  [in] SOCKET s
);

Параметры

[in] s

Дескриптор, определяющий закрываемую сокет.

Возвращаемое значение

Если ошибка не возникает, closesocket возвращает ноль. В противном случае возвращается значение SOCKET_ERROR , а конкретный код ошибки можно получить, вызвав WSAGetLastError.

Код ошибки Значение
WSANOTINITIALISED
Перед использованием этой функции должен произойти успешный вызов WSAStartup .
WSAENETDOWN
Произошел сбой сетевой подсистемы.
WSAENOTSOCK
Дескриптор не является сокетом.
WSAEINPROGRESS
Выполняется блокирующий вызов Windows Sockets 1.1 или поставщик услуг по-прежнему обрабатывает функцию обратного вызова.
WSAEINTR
Вызов сокета Windows 1.1 был отменен через WSACancelBlockingCall.
WSAEWOULDBLOCK
Сокет помечается как неблокивный, но для l_onoff элемента структуры задается значение ненулевого, а для элемента l_lingerструктуры задается ненулевое значение времени ожидания.

Комментарии

Функция closesocket закрывает сокет. Используйте его для освобождения дескриптора сокета, переданного в параметре s . Обратите внимание, что дескриптор сокета, переданный в параметре s , может быть немедленно повторно использован системой сразу после выдачи функции closesocket . В результате невозможно ожидать, что дальнейшие ссылки на дескриптор сокета, переданный в параметре s , завершаются ошибкой WSAENOTSOCK. Клиент Winsock никогда не должен выдавать closesocket для s одновременно с другим вызовом функции Winsock.

Все ожидающие перекрывающиеся операции отправки и получения ( WSASend/ WSASendTo/ WSARecv/ WSARecvFrom с перекрывающимся сокетом), выданные любым потоком в этом процессе, также отменяются. Выполняется любое событие, подпрограмма завершения или действие порта завершения, указанное для этих перекрывающихся операций. Ожидающие перекрывающиеся операции завершаются сбоем с состоянием ошибки WSA_OPERATION_ABORTED.

Приложение не должно предполагать, что все невыполненные операции ввода-вывода в сокете будут гарантированно завершены при возврате closesocket . Функция closesocket инициирует отмену невыполненных операций ввода-вывода, но это не означает, что приложение получит завершение ввода-вывода для этих операций ввода-вывода к тому времени, когда функция closesocket вернет. Таким образом, приложение не должно очищать ресурсы (например, структуры WSAOVERLAPPED ), на которые ссылаются незавершенные запросы ввода-вывода, пока запросы ввода-вывода действительно не будут завершены.

Приложение всегда должно иметь соответствующий вызов closesocket для каждого успешного вызова сокета для возврата всех ресурсов сокета в систему.

Затяжная структура хранит сведения о конкретном сокете, который указывает, как он должен вести себя при постановке данных в очередь для отправки и вызове функции closesocket в сокете.

Элемент l_onoff структуры сохраняющегося объекта определяет, должен ли сокет оставаться открытым в течение указанного времени после вызова функции closesocket , чтобы разрешить отправку данных в очереди. Этот элемент можно изменить двумя способами:

  • Вызовите функцию setsockopt с параметром optname, для SO_DONTLINGER. Параметр optval определяет, как изменяется элемент l_onoff .
  • Вызовите функцию setsockopt с параметром optname, для SO_LINGER. Параметр optval указывает, как изменяются члены l_onoff и l_linger .

Элемент l_linger структуры затяжного объекта определяет время в секундах, в течение времени, в течение времени, в течение нескольких секунд, сокет должен оставаться открытым. Этот элемент применим только в том случае, если l_onoff элемент структуры является ненулевым.

Параметры по умолчанию для сокета — это l_onoff элемент структуры затяжного объекта равен нулю, что означает, что сокет не должен оставаться открытым. Значение по умолчанию для элемента l_linger структуры протяженности равно нулю, но это значение игнорируется, если элемент l_onoff имеет нулевое значение.

Чтобы сокет оставался открытым, приложение должно задать для элемента l_onoff ненулевое значение и задать для элемента l_linger требуемое время ожидания в секундах. Чтобы отключить открытый сокет, приложению достаточно задать для элемента l_onoff структуры затяжной структуры значение 0.

Если приложение вызывает функцию setsockopt с параметром optname , равным SO_DONTLINGER , чтобы задать для элемента l_onoff ненулевое значение, значение элемента l_linger не указывается. В этом случае используемое время ожидания зависит от реализации. Если для сокета было установлено предыдущее время ожидания (путем вызова функции setsockopt с параметром optname , равным SO_LINGER), это значение времени ожидания должно быть восстановлено поставщиком услуг.

На семантику функции closesocket влияют параметры сокета, которые задают элементы структуры linger .

l_onoff l_linger Тип закрытия Ждать закрытия?
нуль Не волнуйте Изящное закрытие Нет
Ненулевой нуль Необратимая Нет
Ненулевой Ненулевой Корректно, если все данные отправляются в течение времени ожидания, указанного в элементе l_linger .

Трудно, если не удалось отправить все данные в течение времени ожидания, указанного в элементе l_linger .

Да
 

Если элемент l_onoff структуры LINGER равен нулю в сокете потока, вызов closesocket возвращается немедленно и не получает WSAEWOULDBLOCK независимо от того, блокирует ли сокет или не блокируется. Однако все данные, помещенные в очередь для передачи, будут отправляться, если это возможно, до закрытия базового сокета. Это также называется корректной отключением или закрытием. В этом случае поставщик сокетов Windows не может освободить сокет и другие ресурсы в течение произвольного периода, что влияет на приложения, которые ожидают использовать все доступные сокеты. Это поведение по умолчанию для сокета.

Если элемент l_onoff структуры является ненулевым, а l_linger элемент равен нулю, closesocket не блокируется, даже если данные в очереди еще не отправлены или не подтверждены. Это называется жестким или прерванным закрытием, так как виртуальный канал сокета сбрасывается немедленно и все неотправленные данные теряются. В Windows любой вызов recv на удаленной стороне канала завершится ошибкой WSAECONNRESET.

Если для элемента l_onoff структуры задается ненулевое значение, а для l_linger элемента установлено ненулевое время ожидания для блокирующего сокета, вызов closesocket блокируется до отправки оставшихся данных или до истечения времени ожидания. Это называется корректное отключение или закрытие, если все данные отправляются в течение времени ожидания, указанного в элементе l_linger . Если время ожидания истекает до отправки всех данных, реализация сокетов Windows завершает подключение до возврата closesocket . Это называется жестким или прерванным закрытием.

Не рекомендуется задавать для элемента l_onoff структуры ненулевого значения, а для элемента l_linger с ненулевым интервалом времени ожидания в неблокивном сокете не рекомендуется. В этом случае вызов closesocket завершится ошибкой WSAEWOULDBLOCK , если операция закрытия не может быть завершена немедленно. Если closesocket завершается сбоем с WSAEWOULDBLOCK , дескриптор сокета по-прежнему действителен, и отключение не инициируется. Приложение должно снова вызвать closesocket , чтобы закрыть сокет.

Если элемент l_onoff структуры задержителя является ненулевым, а элемент l_linger является ненулевым интервалом времени ожидания в блокирующем сокете, результат функции closesocket нельзя использовать для определения того, были ли все данные отправлены в одноранговый узел. Если данные отправляются до истечения времени ожидания, указанного в элементе l_linger , или если подключение было прервано, функция closesocket не вернет код ошибки (возвращаемое значение функции closesocket равно нулю).

Вызов closesocket будет блокироваться только до тех пор, пока все данные не будут доставлены в одноранговый узел или не истечет время ожидания. Если подключение сброшено из-за истечения времени ожидания, сокет не перейдет в состояние TIME_WAIT. Если все данные отправляются в течение периода ожидания, сокет может перейти в TIME_WAIT состояние.

Если элемент l_onoff структуры является ненулевым, а l_linger элемент имеет нулевой интервал времени ожидания для блокирующего сокета, вызов closesocket сбросит соединение. Сокет не перейдет в состояние TIME_WAIT.

Функцию getsockopt можно вызвать с параметром optname , для которого задано значение SO_LINGER , чтобы получить текущее значение структуры , связанной с сокетом.

Примечание Чтобы гарантировать отправку и получение всех данных при подключении, приложение должно вызвать завершение работы перед вызовом closesocket (дополнительные сведения см. в разделе Корректное завершение работы, параметры задержки и закрытие сокета ). Также обратите внимание, что сетевое событие FD_CLOSE не публикуется после вызова closesocket .
 

Ниже приведена сводка по поведению closesocket :

  • Если l_onoff элемент структуры LINGER равен нулю (значение по умолчанию для сокета), closesocket возвращается немедленно, и соединение корректно закрывается в фоновом режиме.
  • Если для элемента l_onoff структуры задается ненулевое значение, а для элемента l_linger задано значение 0 (время ожидания отсутствует), функция closesocket немедленно возвращается, а соединение сбрасывается или завершается.
  • Если для элемента l_onoff структуры задается ненулевое значение, а для элемента l_linger задано ненулевое время ожидания: для блокирующего сокета closesocket блокируется до тех пор, пока не будут отправлены все данные или время ожидания не истечет.

    — Для неблокировки сокета closesocket возвращает немедленное значение, указывающее на сбой.

Дополнительные сведения см. в разделах Корректное завершение работы, Параметры задержки и Закрытие сокета .

Примечание При выполнении блокирующего вызова Winsock, например closesocket, Winsock может потребоваться дождаться сетевого события, прежде чем вызов сможет завершиться. В этой ситуации Winsock выполняет оповещенное ожидание, которое может быть прервано асинхронным вызовом процедуры (APC), запланированным в том же потоке. Выполнение другого блокирующего вызова Winsock внутри APC, который прервал текущий блокирующий вызов Winsock в том же потоке, приведет к неопределенному поведению, и клиенты Winsock никогда не должны пытаться его выполнять.
 

Примечания для сокетов IrDA

Помните о перечисленных ниже моментах.

  • Файл заголовка Af_irda.h должен быть явно включен.
  • Поддерживаются стандартные параметры задерживающегося.
  • Хотя IrDA не обеспечивает корректное закрытие, IrDA откладывает закрытие до тех пор, пока очереди получения не будут очищены. Таким образом, приложение может отправлять данные и немедленно вызывать функцию сокета и быть уверенным, что получатель скопирует данные перед получением сообщения FD_CLOSE.

Примечания для банкомата

Ниже приведены важные проблемы, связанные с разрывом подключения при использовании режима асинхронной передачи (ATM) и сокетов Windows 2.

  • Использование функций closesocket или shutdown с SD_SEND или SD_BOTH приводит к отправке сигнала RELEASE в канале управления. Из-за использования atm отдельных каналов сигналов и каналов данных сигнал RELEASE может достичь удаленного конца до того, как последний из данных достигнет места назначения, что приведет к потере этих данных. Одним из возможных решений является программирование достаточной задержки между последними отправленными данными и вызовами функции closesocket или shutdown для сокета ATM.
  • Половина закрытия не поддерживается atm.
  • Как прерывание, так и корректное отключение приводит к отправке сигнала RELEASE с тем же полем причины. В любом случае полученные данные в удаленном конце сокета по-прежнему доставляются в приложение. Дополнительные сведения см. в разделах Корректное завершение работы, параметры задержки и Закрытие сокета .

Windows Phone 8. Эта функция поддерживается для приложений Магазина Windows Phone на Windows Phone 8 и более поздних версиях.

Windows 8.1 и Windows Server 2012 R2. Эта функция поддерживается для приложений Магазина Windows на Windows 8.1, Windows Server 2012 R2 и более поздних версиях.

Требования

Требование Значение
Минимальная версия клиента Windows 8.1, Windows Vista [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2003 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header winsock.h (включая Winsock2.h)
Библиотека Ws2_32.lib
DLL Ws2_32.dll

См. также раздел

Корректное завершение работы, параметры задержки и закрытие сокета

WSAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Функции Winsock

Справочник по Winsock

Принять

getsockopt

ioctlsocket

Задерживаться

setsockopt

Сокета