2009-12-30 9 views
6

mochiweb 응용 프로그램에서 오래 보유 된 HTTP 요청을 사용하고 있습니다. 사용자와의 연결이 죽었을 때 나는 감지하고 싶어, 나는 수행하여 그 작업을 수행하는 방법을 알아 냈어 : 사용자가 자신 탭/브라우저를 닫거나 페이지를 새로 고칩니다 때 작동inet을 사용하여 HTTP 닫기 감지

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

. 그러나 인터넷 연결이 갑자기 중단되면 (Wi-Fi 신호가 갑자기 손실 된 경우) 브라우저가 비정상적으로 중단되면 TCP 닫기를 감지 할 수 없습니다.

내가 누락되었거나이를 수행하는 다른 방법이 있습니까?

답변

2

TCP keepalive protocol이 있으며 {keepalive, Boolean} 옵션에서 inet:setopts/2으로 활성화 할 수 있습니다.

나는 그것을 사용하지 않을 것을 제안합니다. keep-alive timeout과 max-retries는 시스템 전체에서 사용되는 경향이 있으며 결국 옵션입니다. 프로토콜 수준에서 시간 초과를 사용하는 것이 좋습니다.

HTTP 프로토콜은 status code Request Timeout이며 클라이언트가 죽은 것처럼 보일 경우 클라이언트에 보낼 수 있습니다.

데이터 대기 시간 초과에 사용할 수있는 수신 블록에서 after 절을 확인하거나 타이머 모듈을 사용하거나 erlang:start_timer/3을 사용하십시오. 그것들은 모두 다른 성능 특성과 자원 비용을 가지고 있습니다.

+0

나는 after 절을 사용하는 것을 고려했다. 그러나이 경우에는 내 프로세스가 최대 절전 모드 일 수있다. after 절이 여전히 최대 절전 모드 프로세스에서 작동합니까? – jeffreyveon

+0

아니요, 그렇지 않습니다. 최대 절전 모드 프로세스는 메시지를 보낼 때 깨어납니다. 최대 절전 모드 시간 제한이 없으므로 깨우기 위해 전달 된 메시지가 지연됩니다. – Christian

1

TCP를 통해 기본 "keep alive"프로토콜은 없습니다 (그러나 enabled if supported 일 수 있음). 데이터가 교환되지 않을 때 연결 오류가 발생하면 "자동 오류"로 변환됩니다. 이러한 유형의 장애는 사용자 자신이 직접 처리해야합니다. 연결 프로빙의 일부 형식을 구현하십시오.

이것은 HTTP에 어떤 영향을 줍니까? HTTP는 상태 비 저장 프로토콜입니다. 즉, 모든 요청은 서로 독립적입니다. HTTP의 "keep alive"기능은 변경되지 않습니다. 즉, "자동 실패"가 계속 발생할 수 있습니다.

데이터가 교환 될 때만이 조건을 감지 할 수 있습니다 (또는 TCP 연결 유지를 사용하는 경우).

0

HTTP 청크 인코딩을 통해 응용 프로그램 수준 유지 경고 메시지를 보내는 것이 좋습니다. 연결 유지 메시지를 이해할 수있을 정도로 클라이언트/서버를 지능적으로 유지하고 제 시간에 도착하거나 연결을 닫은 다음 다시 연결하면 무시합니다.