• ベストアンサー

TCPプログラムについて質問です

TCPプログラムについて質問したいのですが、LinuxでTCPを利用して簡易チャットプログラムを作ろうと思っています。 クライアント側で書き込んだ発言をサーバ側のプログラムで表示するところまでは出来ました。 しかし、クライアントにも何を発言したかわかるように新しくモニター用のプログラムを作りたいのですがうまく表示することができません。 どうすればいいのですか? モニター用のプログラムはクライアントでも表示できるようにクライアントプログラムを利用したもので作りたいと思っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • onosuke
  • ベストアンサー率67% (310/456)
回答No.2

今回の質問は、 クライアントプログラムの作成方法に関して 「『処理A』と『処理B』をひとつのプログラムで行えるようにしたい」 ということでよろしいでしょうか? (サーバプログラムの話、サーバクライアント間の通信の話、 処理Bのプログラムの話、は割愛します) 【処理A:発言】 [スタートA] ↓ [イベントA:利用者が発言を書き込む] ↓ [実行A:サーバに発言を送信する] ↓ 「スタートA」に戻る 【処理B:モニター】 [スタートB] ↓ [イベントB:サーバから発言を受信する] ↓ [実行B:受信した発言を画面に表示する] ↓ 「スタートB」に戻る ----------------------------------------------- 上記を実現するには、2つの処理方式があります。 どちらの方式を採用するかは、メリット、デメリットを勘案の上、 判断してください。 なお、こういった処理方式の選択判断は、プログラミング技術の中で とても重要なものです。この機会に、いろいろ考えて悩むのも良い 勉強になると思います。 --------------------------- 方式1:「並列処理」方式 マルチプロセス化やマルチスレッド化により、処理Aと処理Bを同時に処理します。 マルチプロセス化の場合、具体的には、fork()関数を利用します。 処理イメージ: fork(); ↓ if(親プロセスの場合){ [処理A]を実行; } else { [処理B]を実行; } メリット: 今プログラムを直すのは、とても簡単。 デメリット: 今後、[処理A]と[処理B]の間でデータ連携が必要になった場合、 プロセス間通信の仕組みを利用する必要がある。 また、データ連携において、 並列処理特有の様々な問題を考慮する必要がある。 ----------------------------- 方式2:「イベント駆動」方式 処理ABを一本化して、[イベントA]と[イベントB]のどちらが発生しているかで処理分岐を行います。 具体的には、select()関数でイベントの発生を待ちます。 処理イメージ: 【処理AB:発言とモニター】 [スタートAB] ↓ select(...); ↓ if(イベントAが発生){ 実行A; } if(イベントBが発生){ 実行B; } ↓ 「スタートAB」に戻る メリット: [処理A]と[処理B]の間のデータ連携は、普通に変数を利用できる。 並列処理特有の問題を考慮しなくて良い。 デメリット: イベント駆動やselect()関数の考え方を知らない、 初めてのプログラム作成はちょっぴり大変かも。 クライアントプログラムをGUI化すると、 通信処理中はウィンドウ内の表示が固まるかも (画面表示処理を並列実行できないのが原因で)

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
koruman
質問者

お礼

ありがとうございます。 これからどういう風に作って聞けばいいか大体の方針が決まりました。 今回のプログラムはGUIにしたりはしないので出来れば2つ目の方針で頑張っていこうかと思っています。

その他の回答 (1)

回答No.1

「UNIXネットワークベストプログラミング入門」が参考になるのではないでしょうか。 内容は、ミニ電子会議などのサンプルプログラムの解説で、250ページぐらいでTCP/IPのプログラミングの基本的な要素が一通り解説されています。 ちなみにサンプルアプリの画面制御はキャラクタベースで、cursesライブラリを使ってます。 私も一番最初はこの本でTCP/IPのプログラミングを学習しました。 ただ古い本なのでさがすのは大変かも。。。

参考URL:
http://www.amazon.co.jp/gp/product/4874085032