Обнаружение HTTP закрывается с использованием INET

StackOverflow https://stackoverflow.com/questions/1979928

  •  22-09-2019
  •  | 
  •  

Вопрос

В моей заявке 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.

Я что -то упускаю, или есть другой способ достичь этого?

Это было полезно?

Решение

Eсть Протокол TCP Keepalive и это можно включить с inet:setopts/2 под вариантом {keepalive, Boolean}.

Я бы посоветовал вам не использовать это. Тайм-аут и максимум, как правило, широко распространен, и, в конце концов, это возможно, и в конце концов. Использование тайм -аутов на уровне протокола лучше.

Протокол HTTP имеет Тайм -аут запроса кода состояния который вы можете отправить клиенту, если он кажется мертвым.

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

Другие советы

Нет по умолчанию «поддерживать в живых» (но может быть включено, если поддерживается) Протокол по TCP: в случае, если существует ошибка подключения, когда не обмениваются данные, это приводит к «безмолвному неудаче». Вам нужно будет учесть этот тип сбоев сами, например, реализовать некоторую форму исследования подключения.

Как это влияет на HTTP? HTTP является протоколом без сохранения состояния - это означает, что каждый запрос не зависит от всех. Функциональность HTTP «Keep Alive» не меняет, что, т.е. «Тихая неудача» все еще может произойти.

Только когда данные обмениваются Можно ли обнаружить это условие (или когда TCP сохраняется в живых).

Я бы посоветовал отправить на уровень приложения, которые можно сохранить в живых сообщениях через http-chunked-кодирование. Попросите вашего клиента/сервера достаточно умны, чтобы понять сообщения Heap Alive, и игнорировать их, если они прибывают вовремя или закрывают, и снова восстановить соединение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top