Для завершения сеанса сначала необходимо проинформировать партнера, с которым происходило соединение, о завершении передачи данных. Для этого используется функция shutdown, описываемая таким образом:

function shutdown(
s: TSocket:
how: Integer ): Integer, stdcall:

Первый параметр - это сокет, соединение которого необходимо закрыть. Во втором параметре указываются флаги, определяющие завершение. Можно использовать одно из следующих значений:

• SDRECEIVE - запрещение любых функций приема данных. На протоколы нижнего уровня этот параметр не действует. Если используется потоковый протокол (например, TCP) и в очереди есть данные, ожидающие чтение функцией recv, или они пришли позже, то соединение сбрасывается. Если используется протокол UDP, то сообщения продолжают поступать;
• SDSEND - запрещаются все функции отправки данных, и дальнейшая передача становится невозможной;

• SD_B0TH - запрещаются прием и отправка данных.

Даже при завершении работы сокета могут происходить следующие ошибки:

• WSANOTINITIALISED - сначала необходимо вызвать функцию WSASturtup, а потом создавать сокет;
• WSAENETDOWN - связь нарушена, возможные причины - отошел кабель или произошло отключение от Интернета;
• WSAEN0TC0NN - соединение не установлено. Или вы забыли установить соединение с сервером, или оно уже было прервано;
• WSAEINVAL - параметр how имеет недопустимое значение;
• WSAEINPROGRESS - выполняется операция в блокирующем режиме. Вы уже запустили на выполнение какую-то функцию и нужно дождаться завершения ее работы;

• WSAEN0TS0CK - указанный дескриптор не является сокетом.

После того как вы оповестили партнера о завершении работы, можно закрывать сокет. Для этого используется функция closesocket, которая описывается так:

function closesocket(
s TSocket ): Integer,: stdcall.

Указанный в качестве единственного параметра сокет будет закрыт. Если вы попытаетесь использовать его в какой-нибудь другой функции, го получите ошибку WSAEN0TS0CK - дескриптор не является сокетом. Любые пакеты, ожидающие отправки, прерываются или отменяются.

Возможны следующие ошибки при закрытии сокета:

в WSAN0TINІТІALISED - сначала необходимо вызвать функцию WSASturtup, а потом создавать сокет;
о WSAENETDOWN - связь нарушена, возможные причины - отошел кабель пли произошло отключение от Интернета;
о WSAEINPROGRESS - выполняется операция в блокирующем режиме. Вы уже запустили на выполнение какую-то функцию и нужно дождаться завершения ее работы;
о WSAEINTR - функцией WSACancelBlockingCall была прервана блокирующая операция;

о WSAEN0TS0CK - указанный дескриптор не является сокетом.

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

4.7. Функции приема и передачи данных || Оглавление || 4.9. Принцип работы протоколов без установки соединения


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Январь
    2022
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс