Настройка и разрыв подключения
Функция WSAAccept позволяет приложению получать сведения о вызывающем объекте, такие как идентификатор вызывающего абонента и качество обслуживания, прежде чем принимать решение о принятии входящего запроса на подключение. Это делается с помощью обратного вызова функции условия, предоставляемой приложением.
Пользовательские данные, заданные параметрами функции WSAConnect и функции условия WSAAccept , могут быть переданы одноранговой сети во время установки подключения при условии, что эта функция поддерживается поставщиком услуг.
Также можно (для протоколов, поддерживающих эту функцию) обмениваться данными пользователей между конечными точками во время разрыва подключения. Конец, инициирующий разрыв, может вызвать функцию WSASendDisconnect , чтобы указать, что больше не будут отправляться данные, и инициировать последовательность разрыва подключения. Для некоторых протоколов частью удаления является доставка данных об отключении от инициатора удаления. После получения уведомления о том, что удаленный конец инициировал очистку (как правило, по FD_CLOSE признаку), можно вызвать функцию WSARecvDisconnect для получения данных об отключении, если таковые имеются.
Чтобы продемонстрировать, как можно использовать данные отключения, рассмотрим следующий сценарий. Клиентская половина клиентского или серверного приложения отвечает за прекращение подключения к сокету. В случае завершения он предоставляет (с использованием данных об отключении) общее количество транзакций, обработанных с сервером. Сервер, в свою очередь, отвечает совокупным числом транзакций, которые он обработал со всеми клиентами. Последовательность вызовов и указаний может происходить следующим образом:
На стороне клиента | На сервере |
---|---|
(1) Вызов WSASendDisconnect для завершения сеанса и предоставления общего объема транзакций. | |
(2) Получение FD_CLOSE, recv с возвращаемым значением нуля или возврат ошибки WSAEDISCON из WSARecv , указывающее на корректное завершение работы. | |
(3) Вызовите WSARecvDisconnect , чтобы получить общую сумму транзакций клиента. | |
(4) Вычисление совокупного общего объема всех транзакций. | |
(5) Вызов WSASendDisconnect для передачи общего итога. | |
(6) Указание FD_CLOSE получения. | (5a) Вызовите closesocket. |
(7) Вызов WSARecvDisconnect для получения и хранения совокупного общего количества транзакций. | |
(8) Вызов closesocket |
Обратите внимание, что шаг (5a) должен соответствовать шагу (5), но не имеет отношения времени к шагу (6), (7) или (8).