サーバー時刻

サーバー時刻取得機能と動作

nine のサーバー時刻取得機能は、通信相手の時刻を得る機能である。

時刻を提供する側をサーバー、時刻を取得する側をクライアントとする。 サーバーとクライアントの時刻のずれや、時刻取得にかかる通信時間を補正し、関数呼び出し時のサーバーの時刻を計算して返す。

この機能は、時刻同期用のメッセージを交換することで実現されている。 サーバー側の処理は nine 内部で実装されているため、特にコードを記述する必要はない。 クライアント側では以降で説明するようにプログラミングが必要である。

サーバー時刻取得機能はメッセージ層の機能であり、ストリーム通信では使用できない。 機能は MessageServer クラスの関数として提供される。メッセージ通信では MessageServer 具象クラス実装するので、そのインスタンスを用いれば良い。

enableServerTime

MessageServer の enableServerTime() を呼ぶことで、サーバー時刻取得機能を有効にする。

関数のシグネチャは次のようになっている:
bool MessageServer::enableServerTime(int id, uint32_t period, double max_doffset, double min_step)
id
時刻を得る相手と通信しているコミュニケータIDを指定する
period
時刻同期メッセージの送信間隔をミリ秒単位で指定する。
5000 ミリ秒程度で良いであろう。
max_doffset
サーバー時刻を変更する際の変化幅の最大値。
割合で示す。0.1 ならば 1秒間に 100ms まで変化する。
min_step
時刻変更は通常は max_doffset ずつ漸近的に変更を行うが、目標とする時刻との差が大きすぎる場合は直接目標の値に変更する。
min_step は漸近処理を諦める閾値をミリ秒単位で指定する。

getServerTime

enableServerTime() を行えば、後はいつでもサーバー時刻を取得できる。

取得は getServerTime 関数で行う:
      UnixTime getServerTime(int id);
id はサーバーと通信しているコミュニケータID である。

戻り値の UnixTime は、nine の提供する時刻クラスで、1970年1月1日からの経過時間を表す。