6

私の mochiweb アプリケーションでは、長い間保持されていた HTTP リクエストを使用しています。ユーザーとの接続がいつ切断されたかを検出したかったので、次のようにしてそれを行う方法を見つけました。

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

これは、ユーザーがタブ/ブラウザを閉じるか、ページを更新した場合に機能します。ただし、インターネット接続が突然切断された場合 (たとえば、wifi 信号が突然失われた場合)、またはブラウザーが異常にクラッシュした場合、tcp の終了を検出できません。

何か不足していますか、それともこれを達成する他の方法はありますか?

4

3 に答える 3

2

TCP キープアライブ プロトコルがありinet:setopts/2、オプションで有効にできます{keepalive, Boolean}

使用しないことをお勧めします。キープアライブ タイムアウトと最大再試行回数はシステム全体に適用される傾向があり、結局オプションです。プロトコル レベルでタイムアウトを使用することをお勧めします。

HTTP プロトコルには、停止していると思われる場合にクライアントに送信できるステータス コード Request Timeoutがあります。

データの待機をタイムアウトにするために使用できる受信ブロックの句を確認するafterか、timer モジュールを使用するか、または を使用しますerlang:start_timer/3。それらはすべて、異なるパフォーマンス特性とリソース コストを持っています。

于 2009-12-30T14:51:28.163 に答える
1

デフォルトの「キープアライブ」プロトコルはありません (ただし、サポートされている場合は有効にすることができます)。このタイプの障害を自分で説明する必要があります。たとえば、何らかの形式の接続プローブを実装します。

これは HTTP にどのように影響しますか? HTTP はステートレス プロトコルです。これは、すべてのリクエストが互いに独立していることを意味します。HTTP の「キープ アライブ」機能は変更されません。つまり、「サイレント エラー」が引き続き発生する可能性があります。

この状態を検出できるのは、データが交換されている場合 (または TCP Keep Alive が有効になっている場合) だけです。

于 2009-12-30T13:07:17.960 に答える
0

アプリケーション レベルのキープ アライブ メッセージを HTTP チャンク エンコーディングで送信することをお勧めします。キープアライブ メッセージを理解し、メッセージが時間通りに到着した場合は無視するか、閉じて接続を再確立できるように、クライアント/サーバーを十分に賢くしてください。

于 2010-11-04T03:57:24.460 に答える