ここではBBS.pmのサーバ処理とイベント処理について説明します。
BBS.pmのサーバは基本処理とサーバ処理の2部構成で、基本処理が行われたあとサーバ処理が行われ、サーバ処理を抜けると再び基本処理が行われるように、処理が繰り返し行われます。
処理の流れは下図の通りです。
それぞれのイベントでは対応するハンドラが設けられていてイベントが発生するとハンドラが呼び出されます。
基本処理では新たなノードが接続または接続するノードから通信が発生するとイベントが発生します。
新たなノードが接続するとonConnectイベント処理が行われます。
このイベントでは接続するノードのノード番号をノードリストに追加し、接続するノードが保持するデータ領域(ノードテーブル)を確保します。
イベント処理の最後にonConnectハンドラを呼び出します。
接続中のノードから通信が行われるとonAccessイベント処理が行われます。
このイベントではノードから送出(サーバから見て受信)したデータの取得を試みます。
データの取得に成功するとonRecvイベント処理が行われ、取得に失敗すると通信エラーとみなしonDisconnectイベント処理が行われます。
onAccessイベント処理では、イベント処理から直接呼び出されるハンドラはありません。
onAccessイベントで受信データの取得に成功するとonRecvイベント処理が行われます。
このイベントでは取得したデータを引数としてonRecvハンドラを呼び出します。
onAccessイベントで受信データの取得に失敗するとonDisconnectイベント処理が行われます。
このイベントでは接続するノードのノード番号をノードリストから除去し、接続するノードが保持するデータ領域(ノードテーブル)を解放します。
イベント処理の最後にonDisconnectハンドラを呼び出します。
ちなみにonDisconnectイベント処理はエラーによる切断の他、ログアウトなどユーザによる切断のための関数disconnect()でも呼び出すことができます。
基本処理を抜けると次にサーバ処理が行われます。
ここではノードに対してデータを送出するための出力処理(Output)、サーバアプリケーションのシステムを制御するための処理(SysWork)、
ノードからの要求に応答するためのサーバアプリケーション処理(AppWork)の3つが行われ、
これら一連の処理は接続する全ノードをひとつずつ順番に行われます。
Outputイベント処理では最初にOutputハンドラを呼び出します。
Outputハンドラではノードに対してデータを送出する場合、送出するデータをハンドラの返り値に設定してハンドラを抜けます。
ハンドラを抜けイベント処理に戻ったとき、ハンドラからの返り値を受け取るとノードに送出されます。
AppWorkイベント処理ではAppWorkハンドラを呼び出します。