私が知りたいのはPid
、制御プロセスが使用して作成された場合、ソケットが閉じたときにプロセスが終了するかどうか、gen_tcp:controlling_process(Socket, Pid),
およびソケットがこのメッセージを送信する条件は何{tcp_closed, Socket}
ですか? サーバー側のソケットが閉じないようにする方法はありますか、それとも常に正常ですか? また、プロセスを知っているプロセスを終了する特定の方法はありますPid
か?
1 に答える
gen_tcp:controlling_process(Socket, Pid) は、ソケットの制御をプロセス Pid に与えるために使用されます。Socket が閉じられたときのこのプロセスの動作については何も意味しません。
考慮すべきケースがあります。
サーバー Socket をモード {active,false} で開きます。この場合、サーバーは、関数 gen_tcp:recv(Sock, Len) を呼び出したときに、Socket が閉じていることを認識します。 {わかりました、バイナリ}。gen_tcp:controlling_process(Socket, Pid) を使用する場合は、このモードを使用することをお勧めします。コード内で競合状態を回避できるからです。
モード {active,true} または {active,once} でサーバーのソケットを開きます。この場合、サーバーはメッセージ {tcp_closed, Socket} を受け取ります。この場合、競合状態があります。Erlang: gen_tcp:controlling_process による競合状態の回避のトピックを参照してください。
ソケットが閉じるのを防ぐのはサーバーの役割ではなく、常に接続を受け入れる準備ができていると思います。
最後に、Pid などのスムーズな終了のために独自のプロトコルを使用して、いつでもプロセスを終了できます。{stop,Reason} または exit(Pid, Reason) を使用したより残忍な方法。