2009-12-30 31 views
6

Trong ứng dụng mochiweb của tôi, tôi đang sử dụng một yêu cầu HTTP được giữ lâu. Tôi muốn phát hiện khi kết nối với người dùng qua đời, và tôi đã tìm ra cách để làm điều đó bằng cách thực hiện:Phát hiện đóng HTTP bằng cách sử dụng inet

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

này hoạt động khi: dùng đóng tab của ông/trình duyệt hoặc làm mới trang. Tuy nhiên, khi kết nối internet chết đột ngột (nói rằng tín hiệu wifi bị mất đột ngột), hoặc khi trình duyệt bị treo bất thường, tôi không thể phát hiện một tcp gần.

Tôi có thiếu thứ gì đó hoặc có cách nào khác để đạt được điều này không?

Trả lời

2

Có một TCP keepalive protocol và có thể được bật với inet:setopts/2 theo tùy chọn {keepalive, Boolean}.

Tôi khuyên bạn không nên sử dụng. Thời gian chờ tiếp tục và thời gian chờ tối đa có xu hướng là hệ thống rộng và sau cùng là tùy chọn. Sử dụng thời gian chờ ở cấp độ giao thức tốt hơn.

Giao thức HTTP có status code Request Timeout mà bạn có thể gửi cho khách hàng nếu có vẻ như đã chết.

Kiểm tra mệnh đề after khi nhận các khối mà bạn có thể sử dụng để hết thời gian chờ dữ liệu hoặc sử dụng mô-đun hẹn giờ hoặc sử dụng erlang:start_timer/3. Tất cả đều có đặc điểm hiệu suất và chi phí tài nguyên khác nhau.

+0

Tôi đã xem xét sử dụng mệnh đề sau, nhưng trong trường hợp này, quy trình của tôi có thể là quá trình ngủ đông. Liệu mệnh đề sau vẫn làm việc cho một quá trình ngủ đông? – jeffreyveon

+0

Không, nó sẽ không. Một quá trình ngủ đông thức dậy khi một tin nhắn được gửi đến nó. Không có thời gian chờ ngủ đông, do đó, có một tin nhắn bị trì hoãn gửi đến cho bạn để thức dậy. – Christian

1

Không có giao thức "giữ nguyên" mặc định (nhưng có thể là enabled if supported) qua TCP: trong trường hợp có lỗi kết nối khi không có dữ liệu được trao đổi, điều này chuyển thành "lỗi thầm lặng". Bạn sẽ cần phải tự mình giải thích loại lỗi này, ví dụ: thực hiện một số hình thức thăm dò kết nối.

Điều này ảnh hưởng đến HTTP như thế nào? HTTP là giao thức không trạng thái - điều này có nghĩa là mọi yêu cầu đều độc lập với nhau. Chức năng "tiếp tục hoạt động" của HTTP không thay đổi, tức là "lỗi im lặng" vẫn có thể xảy ra.

Chỉ khi dữ liệu được trao đổi điều kiện này có thể được phát hiện (hoặc khi TCP Keep Alive được bật).

0

Tôi khuyên bạn nên gửi cấp ứng dụng giữ các tin nhắn còn sống trên mã hóa chunked HTTP. Yêu cầu khách hàng/máy chủ của bạn đủ thông minh để hiểu các thư còn sống và bỏ qua chúng nếu chúng đến đúng giờ hoặc đóng và thiết lập lại kết nối.

Các vấn đề liên quan