3

TCP接続を受け入れるサーバー(gen_tcpを使用するgen_server)があり、接続ごとにスーパーバイザーを生成します。次に、そのスーパーバイザー(別のより永続的なスーパーバイザーによって監視される)は、プロトコル固有のハンドラーとデータベースと通信するクライアントコンテキストの2つのプロセスを生成します。

プロトコルハンドラーは、ソケットからTCPメッセージを受け取り、それらをクライアントコンテキストのメッセージに変換します。クライアントコンテキストはそれらのメッセージを受け取り、データベースと通信し、プロトコルハンドラーがTCP(telnet、ssh、websockets、HTTP ...)で使用しているプロトコルに変換するメッセージを返し、クライアントに送り返します。

私が知りたいのは、プロトコルハンドラーとクライアントコンテキストプロセスに適切なOTPの動作です。gen_serverを悪用する可能性がありますが、プロセスペアごとに1つの接続です。gen_fsmは、通過する状態がいくつかあるため、プロトコルハンドラーで機能するように見えますが、クライアントコンテキストにはかなり不適切です。クライアントコンテキストのgen_eventについて考えていましたが、これはイベントアグリゲーター向けであり、単一のソースからのイベントのみを処理すると信じられてきました。

私はこれを完全に間違った方法で行っていると言ってください。この複合施設の近くでOTPアプリケーションを作成しようとしたのはこれが初めてです。

4

2 に答える 2

2

カウボーイにあるアクセプタープールを再実装しようとしているようです。このアプリケーションは、それ自体を小さなHTTPサーバーに見せかけますが、実際にはコア内の単なるソケットサーバーです。AndrewThompsonが独自のgen_smtpにどのように使用したかを確認してください。

于 2011-09-21T07:47:46.043 に答える
1

スーパーバイザーを使用して2つのプロセスを「グループ化」する必要はないと思います。したがって、TCPプロトコルハンドラー用の単一のスーパーバイザー(シングルトンであると想定)、およびクライアントコンテキストgen_server用のsimple_one_for_one。新しい接続が受信されると、simple_one_for_oneスーパーバイザーは新しいクライアントコンテキストgen_serverを作成するように求められます。2つのプロセスが相互にPidを認識していることを確認して、通信できるようにします。また、エラー処理のためにそれらをリンクします。

于 2011-09-21T06:19:56.517 に答える