C言語 プログラム

英単語辞書プログラムに続いて、トランプのスピードをクライアントサーバモデルで提供するプログラムです。

ソケットプログラミングを学習したので、それを利用して作成してみました。

プログラムの概要

プログラムの概要としては、サーバプログラムを起動させた後、クライアントプログラムが接続されると、2人単位でスピードのサービスを提供するプログラムです。

CS-speed プログラムの実行例
CS-Speedの実行例

サーバとクライアント間でTCPコネクションを確立し、サーバプログラムは子プロセスを作成してスピードのサービスを2台のクライアントに提供します。

サーバプログラムの親プロセスは、クライアントとのコネクション処理と子プロセスの生成処理をループで実行し続けます。これにより、3台以上のクライアントにもスピードを提供することができます。

2組のクライアントによるスピードが終了すれば子プロセスが終了します。

処理の内容

ソケットの準備 (S)

サーバはTCP用のsocketをsocket()で作成し、bind()でサーバのアドレスやポート情報を関連付けます。また、listen()で同時接続数を設定し、accept()でクライアントからの接続を待ちます。

子プロセスの生成 (S)

サーバはaccept()で返ってきたTCPコネクションが確立したソケットディスクリプターを配列に格納し、待機状態のクライアントが2台存在するとき、子プロセスを生成して子プロセスが2台のクライアントにスピードを提供します。親プロセスはaccept()から子プロセスの生成までを永遠とループで実行します。

スピードの提供 (S)

ここは普通に配列を用いてスピードのゲームを提供する処理です。要素数を30とする山札の配列を用意し、乱数を用いて無作為にシャッフルします。1~13×2より26枚となるのが普通ですが、今回は終了時の処理も考えて空カードを表現する”0″を4枚加えました。そのため、シャッフル時も台札[0]~台札[25]までをシャッフルします。その後、互いの山札の配列からカードを4枚を手札用の配列にコピーします。同様に、台札用の配列[2]に互いの山札からカードをコピーします。

またどちらのクライアントのソケットからデータが受信されたのかを上手く判別するために、今回はselect()を利用しました。そのための前処理をFD_ZERO()やFD_SET()で行います。

ここからゲームが終了するまではループ処理になります。

sprintf()で手札と台札の情報を文字列として配列に格納し、write()でその文字列をクライアントに送ります。また、台札の配列のインデックスから終了の判断を行います。具体的にはどちらかの山札のインデックスが30、または双方のインデックスが30であれば、終了処理を行います。終了でない場合は、台札と手札を調べて、どちらかでもカードを出せる状況であるかを確認し、出せない場合は互いに山札から台札にカードを出します。どちらかでも出せる場合は、select()でクライアントからのデータの受信を待ちます。どちらからの通信であるかはFD_ISSETの返り値から調べ、read()で送信してきた方のソケットのデータを読み取ります。また、読み込んだデータが場に出せるカードかを調べ、出せる場合は更新フラグをセットします。更新フラグがある場合は、送られたきたカードの情報をもとに、台札と手札の情報を更新します。最後にフラグの情報を初期化してループの頭に戻ります。

ソケットの準備 (C)

socket()でTCP用のソケットを作成し、サーバーのポートやアドレス情報を書き込みます。それらを引数にしてconnect()を実行しサーバとの接続を確立します。

表示・入力・更新 (C)

ここからループ処理に入ります。read()でサーバーからのトランプ情報を読み込み、scanf()でどのカードを出すのかを入力させます。その後、write()で入力したカードの情報をサーバーに送ります。

子スレッドによる表示更新

クライアントの親スレッドがscanf()で入力を待機している間に、もう一方のクライアントがカードを台札に出して状況が変わったときのための処理です。子スレッドはscanf()の間、while(1)の中でread()とprintf()による表示処理を実行します。スレッドの制御は親スレッドがpthread_cancel()やpthread_join()を利用しました。

終わりに

それっぽいプログラムはできたかなと思います。

もうすこし色々なプログラムを書いてみたいのですが、卒業研究に関連したOSのコードリーディングの方も勧めたいと思います。

“cs-speed” をダウンロード cs-speed_v20170207.zip – 480 回のダウンロード – 129 KB

【C言語】ソケット通信を利用したスピードを提供するプログラム「cs-speed」
Tagged on:

コメントを残す