Одной из первых функций проверки готовности сокета была функция select, которая описывается следующим образом:

function select! nfds: Integer: readfds. writefds.
exceptfds: PFDSet: timeout: PTimeVal ): Longint;
stdcall:

Функция возвращает количество готовых к использованию дескрипторов Socket. Теперь рассмотрим параметры этой функции:

• nfds - игнорируется и служит только для совместимости с моделью сокетов Беркли;
• readfds - проверка возможности чтения (структура типа fd_set);
• wntefds - проверка возможности записи (структура типа fdset);
• exceptfds - проверка срочных данных (структура типа fdset);

• timeout - максимальное время ожидания или NULL - для блокирования дальнейшей работы (ожидать бесконечно).

Структура f dset представляет собой набор сокетов, от которых ожидается разрешение определенной операции. Например, если вам нужно дождаться прихода данных на один из двух сокетов, то вы можете сделать следующее - добавить в набор fdset два созданных сокета и запустить функцию select, указав в качестве второго параметра набор с шкетами.

Функция select будет ожидать данные в течение указанного времени, после чего вы можете прочитать их из сокета. Но данные могут прийти только на один из двух сокетов или вообще не прийти, потому что просто вышло время ожидания Как узнать, на какой именно? Для начала нужно обязательно проверить, входит ли сокет в набор, с помощью функции FDISSET.

При работе со структурой типа fd_set вам понадобятся следующие функции:

• FD_ZER0 - прежде чем добавлять в набор новые сокеты, необходимо его очистить, чтобы проинициализировать набор. Очистка должна происходить именно этой функцией, а не удалением FD_CLR, потому что вторая функция не инициализирует набор, а просто удаляет его элементы. Функция имеет один параметр - указатель на переменную типа fd_set.

• FDSET - помещает сокет в набор. У функции два параметра - сокет, который нужно добавить, и переменная типа fd_set - набор.

• FDCLR - удаляет сокет из набора. Функция имеет два параметра - сокет и набор, из которого будет происходить удаление.

• FDISSET - проверяет, входит ли сокет, указанный в качестве первого параметра, в набор типа fd_set, являющийся вторым параметром.

4.13. Сокеты в неблокирующем режиме || Оглавление || 4.13.2. Пример использования функции select


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