Обнаружение HTTP близко с помощью inet

В моем mochiweb приложении я использую длинный сохраненный Запрос HTTP. Я хотел обнаружить, когда соединение с пользователем умерло, и я выяснил, как сделать это путем выполнения:

Socket = Req:get(socket),
inet:setopts(Socket, [{active, once}]),
receive
     {tcp_closed, Socket} ->
             % handle clean up
     Data ->
             % do something 
end.

Это работает когда: пользователь закрывает свою вкладку/браузер или обновляет страницу. Однако, когда интернет-соединение внезапно умирает (скажите, что сигнал Wi-Fi проиграл внезапно), или когда браузер отказывает неправильно, я не могу обнаружить tcp близко.

Я пропускаю что-то или являюсь там каким-либо другим способом достигнуть этого?

6
задан jeffreyveon 30 December 2009 в 12:22
поделиться

2 ответа

Существует TCP протокол keepalive и его можно включить с помощью inet:setopts/2 под опцией {keepalive, Boolean}.

Я бы посоветовал вам не использовать его. Тайм-аут keep-alive и максимальные повторные попытки, как правило, являются системными, и в конце концов, они необязательны. Лучше использовать таймауты на протокольном уровне.

В протоколе HTTP есть код состояния Request Timeout, который можно отправить клиенту, если он кажется мертвым.

Проверьте пункт after в блоках получения, которые можно использовать для таймаута в ожидании данных, или используйте модуль таймера, или используйте erlang:start_timer/3. Все они имеют различные характеристики производительности и стоимость ресурсов.

.
2
ответ дан 17 December 2019 в 18:16
поделиться

По умолчанию не существует протокола "keep alive" (но может быть включен , если поддерживается ) по TCP: в случае ошибки соединения при отсутствии обмена данными, это переводится как "молчаливый провал". Вы должны будете сами объяснить этот тип сбоя, например, реализовать какую-либо форму зондирования соединения.

Как это влияет на HTTP? HTTP является протоколом без статуса апатрида - это означает, что каждый запрос не зависит от другого. Функциональность "keep alive" HTTP не меняется, т.е. "молчаливый сбой" все равно может произойти.

Только при обмене данными это условие может быть обнаружено (или при включенной функции TCP Keep Alive).

.
1
ответ дан 17 December 2019 в 18:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: