TOP > 講座 > ネットワーク講座 > 複数クライアント接続対応って何? |
前述のサーバは、一つのクライアントの接続を受けて、そのクライアントに対して仕事をして、終了する、というあまり応用用途をイメージできない動作をしていましたが、ここでは、次のような仕様を持つアプリケーションを作ります。
この仕様は汎用的な言い方をすると次のようなことを実現しているといえます。
では、サーバプログラムを見ていきましょう。
クライアントからの接続要求や、クライアントからのメッセージはサーバに発生するイベントと考えることができます。そして、今回の仕様では、これらのイベントが、いつ、いかなるときに発生するか、サーバにはわかりません。 そのため、イベントが来るまで待機し、イベントが来たら処理する、という流れを繰り返しループ(while)の中で行います。 イベントは「あるソケットにデータが到着したので読めるよ!」、「あるソケットに接続要求が到着したから受付可能だよ!」といったものになります。 イベントが来るまでの待機に、selectを使っています。ソケットをfd_set型のデータ(readfds)に設定(FD_SET)し、さらにそのreadfdsをselectに設定することで、所望のイベントが到着するまで待機する、ということが実現できます。つまり、設定したソケットへの接続要求やデータの到着を、selectが監視してくれるようなイメージです。 イベントが発生するとselectが戻り、readfdsにイベント発生したソケットを判別するための情報が格納されます。 FD_ISSETマクロを使うことで、イベントが発生したソケットを知ることができるので、条件分岐させ、そのソケットに対する処理を行うことができます。 では、クライアントプログラムを見ていきましょう。
クライアントでは大きく二つのイベントが発生します。一つはサーバからのメッセージ到着、もう一つは20秒周期処理を実現するための「20秒経過しました」イベントです。サーバ同様、イベントが来るまで待機し、イベントが来たら処理する、という流れを繰り返しループ(while)の中で行います。 サーバと比較するとselectの使い方が若干異なっています。それは第5引数にタイムアウト時間を設定していることです。ソケットに対するイベントが発生せず、第5引数に設定した時間が経過した場合、selectは0を返します。この機能を利用し、20秒周期を実現しています。 timeGetTime()という関数を呼び出していますが、使用するにはwinmm.libというライブラリが必要です。前述のWinsock2ライブラリ(ws2_32.lib)と同じように追加してください。 では、実際に動作させてみましょう。
いかがでしょうか? サーバが持つ情報の全クライアントでの共有、クライアント間のサーバ経由の通信ができていることがわかると思います。 また、クライアントを一つ終了させて(右上の×で終了)、さらに新しく起動させてみたりしてみてください。クライアントの接続、切断が自由にいつでもできることがわかるかと思います。 今回のプログラムは非常に小規模なものですので、それほど実感はないかもしれませんが、送受信しているデータがあまりイケてません。もっとシンプルにかつ保守しやすいように、「プロトコルって何?」で説明したような典型的な通信データへ最適化することができます。>>通信データ最適化って何?
|
Copyright (c) 2013 Studio Four Dimension. All Rights Reserved. |