Сейчас мы рассмотрим две наиболее интересные функции, с помощью которых можно управлять опциями проекта. Первая - getsockopt - возвращает опции сокета, а вторая - setsockopt - устанавливает параметры. Функция getsockopt описывается следующим образом:

function getsockopt( s: TSocket: level, optname: Integer;
optval: PChar: var optlen: Integer ): Integer: stdcalT;

Функция setsockopt описывается так:

function setsockopt( s: TSocket;
level.
optname: Integer;
optval- PChar: optlen: Integer ): Integer: stdcall:

Рассмотрим параметры обеих функций, ведь они одинаковы:

• s - сокет, параметры которого надо считать/записать;
• level - уровень, который определяет параметр. Здесь можно указывать S0L_ SOCKET или IPPR0T0_TCP;
• optname - имя параметра, значение которого надо изменить. Имена зависят от значения, заданного во втором параметре;
• optval - значение параметра, которое надо установить;

• optlen - размер устанавливаемого значения

Если в качестве второго параметра установлен уровень S0L_S0CKET, то в третьем параметре можно указать одно из следующих значений:

• S0_ACCEPTC0NN (тип Boolean) - этот параметр предназначен только для чтения Если он равен true, то сокет находится в режиме прослушивания порта.

• S0_BR0ADCAST (тип Boolean) - если указать true, то сокет сконфигурирован для отправки или приема широковещательных пакетов. Широковещание позволяет отправлять пакеты всем компьютерам сети. Этот параметр допустим для протоколов без установки соединения (нельзя использовать с SOCKSTREAM). Старайтесь не применять широковещание в своих проектах без особой необходимости, потому что множество таких пакетов могут перегрузить сеть Пример использования широковещания приведен в разделе 5.7.

• S0_C0NNECT_TIME (тип Integer) - позволяет определить время соединения. Этот параметр предназначен только для чтения, потому что время соединения изменить вручную нельзя.

• S0D0NTLINGER (тип Boolean) - если установить в false, то при закрытии сокета все данные, находящиеся в очереди на отправку или прием, будут корректно обработаны. Если этот параметр установить в true, то через определенное время сокет закроется без обработки данных из очереди.

• S0D0NTR0UTE (тип Boolean) - если равен true, то пакет будет отправлен непосредственно на сетевой интерфейс получателя, без обработки таблицы маршрутизации.

• SOEXCLUSIVEADDRUSE (тип Boolean) - если равен true, то ни одно другое приложение не сможет использовать выбранный вами порт на локальной машине. Именно это значение используется по умолчанию. Если параметр установить в false, то порт не блокируется и может быть открыт другим процессом. При этом системе сложно будет определить, какое из двух приложений должно получить данные, пришедшие на порт. Я не рекомендую использовать этот параметр, потому что программа может работать непредсказуемым образом и не получать нужные данные.

• S0LINGER (тип - структура типа linger) - определяет время ожидания обработки очереди сообщений после закрытия сокета. Если в течение этого времени не все данные будут отработаны, сокет все равно закроется

• SOMAXMSGSIZE (тип integer) - этот параметр можно только прочитать и узнать, какой максимальный размер имеет сообщение. Имеются в виду сообщения пакетов без установки соединения, потому что при установленном соединении можно отправить пакет любой длины, и он будет корректно разбит но частям и доставлен без ошибок.

• SO_RECVBUF (тип i nteger) - с помощью этого параметра можно определить или задать размер буфера приема.

• S0SNDBUF (тип integer) - с помощью этого параметра можно узнать или изменить размер буфера отправки.

• SO_REUSEADDR (тип Boolean) - если установлен в true, то можно создать сокет только с таким адресом, который уже используется другим сокетом. Как мы уже говорили, нежелательно использовать сокеты, участвующие в других процессах. В данном случае параметр применим, если сервер "завис" и заблокировал порт в состоянии TIME_WAIT. Такой сервер не будет принимать новые соединения, а новый нельзя создать без установки данного параметра.

• S0SNDTIME0 (тип Integer) - можно определить и изменить время ожидания для отправки в блокирующем режиме.

• S0_RCVTIME0 (тип Integer) - можно определить и изменить время ожидания для получения данных в блокирующем режиме.

Это основные и самые интересные параметры уровня S0L_S0CKET.

В TCP/IP нас будет интересовать еще один уровень IPPR0T0TCP, в котором можно установить параметр TCP_NODELAY. Заголовок пакета TCP составляет 20 байтов. Если отправлять по сети пакеты по 1 байту и при этом к каждому из них будет прикрепляться заголовок в 20 байтов, то это будет слишком расточительно. По умолчанию сокет накапливает данные и старается отправлять пакеты более полными, для оптимизации трафика. Это хорошо, но когда нужно отправлять маленькие пакеты, возникнут неоправданные задержки, и в этом случае неплохо было бы установить параметр TCP_N0DELAY в true.

В следующей главе, когда будем рассматривать прокси-сервер для HTTP-протокола, мы увидим пример использования TCP_N0DELAY и его преимущества.

4.13.4. Когда и что использовать? || Оглавление || 4.15. Заключение


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



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

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31