Column: Socket

Socket

BBS.pmの大きな特徴として、システム(サーバ)とアプリケーションが独立し、 システム側はBBS.pmがサーバやクライアントの維持管理を、 アプリケーション側はアプリケーション処理をアプリケーション作成者が担いますが、 双方が相手に干渉することを禁止しています。

例えば、システム側であるBBS.pmはイベントが発動したときに応じハンドラを呼び出しますが、 呼び出し先のハンドラの処理結果については一切関知せず、 ハンドラの処理が何をしてもシステム側の挙動が変わることはありません。

一方、アプリケーション側が行うアプリケーション処理は、全て呼び出されるハンドラを通して行われますが、 それ以外のところで行うようなことをすればサーバに干渉することになるため、システムが正常に動作する保証はありません。

また、アプリケーション処理はBBS.pmで提供する関数を用いていることが前提になります。

提供している関数は、運用する上で必要な干渉を行うために用意していますので、別の方法でアクセスすることもルール違反になります。

ただし、注意すべきこととして、ソケットへのアクセスが非常に緩く クライアント識別やデータ送信のためにクライアントのソケットオブジェクトをアプリケーション側に引き渡していますが、 従来はソケットオブジェクトをそのまま引き渡していたため、ソケット切断などが呼び出された場合、 アプリケーションがサーバに干渉するためシステムが正常に動作することができません。

このモジュールはそのような問題を解消するために用意しました。

本システムのソケットオブジェクトはIO::Socketが継承されていますが、 呼び出されるハンドラからfrom()を呼び出すことで取得できるソケットオブジェクトは、 従来は、この継承されたオブジェクトそのものでしたので、オブジェクトに対しdisconnect()を呼び出すとソケットが切断されてしまいますが、 ハンドラが終了するとイベント処理に戻りそこでソケット切断などのクライアント整理が行われますが、すでにソケットが切断されていると、 サーバが正常に動作することができないため、本モジュールではそのような関数のアクセスを無効化しています。

機能の追加や改良により呼び出しが禁止または予定される関数は次のものになります。

関数 説明
disconnect() ソケットの切断はBBS.pmが行っているため、アプリケーション作成者が命令する必要はありません。
send() データ送信は現行、send()を直接呼び出していますが、今後、モデムエミュレーション機能を実装予定のため、
データ送信の方法が変更になります。

最後に

ソケット関連処理は随時変更する可能性の高いため、今後の動向にご注意ください。

Task Runner