Поведение сокета в режиме HTTP

В режиме HTTP сокет ведёт себя иначе, чем в обычном режиме данных.

Отклонение входящих соединений

Как объяснялось в разделе Приём входящих соединений, если устройство "решает" отклонить входящее TCP-соединение, оно отправляет пакет TCP reset. Так другой узел сразу узнаёт об отказе. Для HTTP-сокетов правила другие:

  • Если на веб-сервер устройства поступило входящее TCP-соединение (запрос входящего HTTP-соединения), в приложении есть один или несколько сокетов, настроенных на приём этого соединения, и все они уже заняты, то система вообще не отвечает запрашивающему узлу.
  • Если поступил запрос входящего HTTP-соединения, а в приложении нет HTTP-сокетов, настроенных на его приём, система всё же ответит пакетом reset.

Благодаря такому поведению приложению хватает меньшего числа HTTP-сокетов. Вот почему: если все HTTP-сокеты заняты и приложение отправит reset, браузер покажет сообщение "соединение сброшено". Если же устройство вообще не ответит, браузер подождёт и повторит запрос позже. Браузеры "терпеливы": обычно они делают несколько попыток, прежде чем сдаться. Если за это время какой-либо HTTP-сокет освободится, повторный запрос будет принят, и браузер получит свою страницу. Поэтому несколько HTTP-сокетов могут обработать большое число запросов страниц последовательно и с малым числом отказов.

Другие отличия

  • Все входящие данные по-прежнему сохраняются в буфере передачи (да, именно в буфере передачи, TX). Однако эти данные не передаются вашей программе, а интерпретируются как HTTP-запрос. Запрос должен быть правильно оформлен. Объект sock поддерживает команды GET и POST.
  • Буфер приёма (RX) не используется вообще, и выделять под него память не нужно.
  • Команды GET и POST могут содержать "переменные запроса". Они сохраняются в буфере VAR, откуда программа может прочитать их позже.
  • Событие on_sock_data_arrival не возникает, когда строка HTTP-запроса принимается в буфер приёма.
  • Когда запрос принят целиком, сокет готовит ответ и начинает его выдачу. Программа не управляет этой выдачей, пока в HTTP-файле не встретится фрагмент кода Tibbo BASIC/C. Событие on_sock_data_sent использовать также нельзя.
  • Когда в HTTP-файле встречается фрагмент кода, управление передаётся ему, и программа может выполнить нужное действие (например, сформировать динамическое HTML-содержимое). При входе во фрагмент sock.num автоматически устанавливается в правильный номер сокета.
  • После отправки HTTP-ответа клиенту сокет автоматически закрывает соединение, как и принято для HTTP. Особое свойство sock.httpnoclose позволяет изменить это поведение по умолчанию и оставить соединение открытым.
Исходный материал Tibbo обновлён 11 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке