MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

【C言語】サーバにマルチスレッドを実装し、マルチクライアントに対応してみた

投稿日:2020年2月8日 更新日:


サーバ側のプログラムは、

多数のクライアントに対応するため、

マルチクライアント化に

する必要があります。



マルチクライアントに対応していないと、

1クライアントが

サーバと通信している間は、

他のクライアントは通信できません。



正確にはlisten が完了した段階で、

3ウェイハンドシェークは完了できますが、

サーバとの次の通信では進めません。



したがって実用的なサーバであれば、

多くのクライアントとの通信に

耐えられなければいけません。



マルチクライアント化をするには

いくつか方法がありますが、

今回はマルチスレッドを採用します。



マルチスレッドを実装するために

pthreadライブラリを使用します。



今回行うマルチスレッドの

イメージはこんな感じです。

ちなみに並行処理できる

最大クライアント数は3です。


スレッド化する場所は

acceptの箇所です。







ちなみに、

もしacceptまで1つ流れで行い、

実際のサーバ処理(send-recv)を

マルチスレッド化した場合は、



acceptは常に確認している状態なので、

クライアントが次々と

無数につながってしまいます。



厳密にはlistenでキューに入った

クライアント数だけ並行処理出来ます。



今回はクライアント数を3にして、

4クライアント目で

サーバはaccept出来ないこと

確認してみます。



逆を言えば、3クライアントまでは

accept出来るとを実感してみます。






pthreadを使用しているので、

基礎的な使い方が分からない方は、

こちらも併せて読むと理解しやすいです。



【C】マルチスレッド&ミューテックスの使い方
https://wireless-network.net/multi-thread-mutex/


コード



それでは今回のソースはこちらです。


コードの詳細と実行


用意する関数は4つです。

  • main
  • server_socket
  • accept_thread
  • handle_conn



main関数で

サーバソケットを作成し、

accept_threadの関数の

スレッドを複数作成します。



他の各関数については、

ソース中のコメントアウトで

説明してある処理を行います。



なお全てのスレッド(accept_thread)が

acceptで待っていると、

kernelでエラーを起こす場合があるらしいので、

mutexをロックしたスレッドのみが、

acceptで待つようになっています。



実際に動かしてみると

以下の感じになります。



実行して数十秒たったあとの

画面キャプチャです。

緑枠はスレッド作成が作成できたことを

意味し、スレッドIDが表示さています。



下4行のState lockを見ると、

今は2121824000のスレッドが

mutexをロックして、

acceptのところで待機しています。



実際にtelnetで接続してみましょう。


※上の画像とスレッドIDが違うのは、
 気にしないでください。
 プログラムを再実行させたためです。



3クライアントから接続しました。

緑枠で囲った箇所が

接続成功を意味しています。



次にこの画像を見て下さい。

まずは緑枠からです。




画像の右半分が、

3クライアント目の画面(Cygwin)です。

左半分がサーバ側の画面です。



クライアント側でaaaaaaaaaと、

入力してエンターを押します。

すると、サーバ側で入力された文字が

出力されて、接続が閉じます。



次に赤枠を見て下さい。



実は4クライアント目が接続待ち

していたため、3クライアント目が

コネクションを閉じた瞬間に

4クライアント目がつながりました。



赤枠の3行目はデバッグですが、

現在mutexをロックしている

スレッドIDを表示させています。



-1を表示しているので、

どのスレッドもmutexを

確保していないことが分かります。



つまりどのスレッドも、

handle_conn関数の処理中なので、

acceptで待っていないということです。





すぐには難しいと思うので、

実際に動かしてみると

理解しやすいです。




最後まで読んでいただきありがとうございました。



もっと詳しく知りたい方は、

下記の図書を参考にすると良いです。



ネットワークプログラミング全般から

マルチクライアント化についても

大変詳しく説明が載っています。



参考資料:
linux ネットワークプログラミングバイブル
著 : 小俣光之, 種田元樹


-プログラミング

Copyright© MasaのITC Life , 2023 All Rights Reserved Powered by STINGER.