Для HTTP используйте один из режимов пакетов HTTP, задокументированных для функции inet:setopts/2
.Например, чтобы установить сокет для получения HTTP-сообщений в виде двоичных файлов, вы можете установить {packet, http_bin}
для сокета.Взгляните на мой простой пример веб-сервера , чтобы узнать, как использовать режимы HTTP-пакетов.
Для RTSP нет встроенного синтаксического анализатора пакетов, но поскольку заголовки RTSP ориентированы на строкиКак и HTTP, вы можете выполнять собственный анализ заголовка в режиме {packet, line}
.В этом режиме вы будете получать по одному заголовку за раз, пока не получите пустую строку, указывающую конец заголовков.Затем вы можете переключить сокет в режим {packet, raw}
, чтобы получить любое тело сообщения.Заголовок Content-Length
, если присутствует, указывает размер любого тела сообщения.
Упомянутые вами режимы сокетов {active, true}
vs {active, false}
определяют, как данные поступают в управляющий процесс (владелец) сокета.
- Режим
{active, true}
отправляет все данные из сокета в управляющий процесс, как только они поступают.В этом режиме данные поступают в виде сообщений в очередь сообщений владельца.Получение сообщений в очереди сообщений процесса - это здорово, поскольку оно позволяет процессу обрабатывать и другие сообщения Erlang, не связанные с сокетами, при обработке данных сокетов, но {active, true}
используется не так часто, поскольку не оказывает обратного давления TCP наотправитель, и поэтому быстрый отправитель может переполнить получателя. - В режиме
{active, false}
требуется, чтобы получатель вызвал gen_tcp:recv/2,3
в сокете для извлечения данных.Это не имеет проблемы противодавления {active, true}
, но может сделать обработку сообщений неудобной, поскольку процесс Erlang должен активно запрашивать данные сокета, а не просто сидеть в цикле receive
, как это может быть с другим active
mode. - Два других
active
режима, которые вы не упомянули, это {active, once}
и {active, N}
.В режиме {active, once}
принимающий процесс получает одно сообщение через свою очередь сообщений за раз, причем сокет переходит в пассивный режим {active, false}
после каждого сообщения.Чтобы получить другое сообщение, получатель должен снова установить {active, once}
на сокете, когда он будет готов к следующему сообщению.Этот режим хорош тем, что сообщения поступают в очередь сообщений процесса точно так же, как и в режиме {active, true}
, но обратное давление по-прежнему работает.Режим {active, N}
аналогичен, за исключением того, что сообщения N
, а не только одно, принимаются до того, как сокет возвращается в пассивный режим.