• ベストアンサー

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

関連するQ&A

  • VC++でのTCP/IP接続プログラム

    こんにちは。 VC++で開発を行っています。 TCP/IP接続(ストリーム型)のプログラムがうまく書けません。 UDP/IP接続は出来たのですが・・・。 TCP/IP接続で、送受信可能なプログラムを作りたいと思っています。 一つのアプリケーションで、サーバーとクライアントの役割を持たせたいのですが・・・。 不可能でしょうか?? VC++でTCP/IPを利用したプログラムのサンプルでも構いません。 なにか情報をお持ちの方、教えてください。 よろしくお願いします。

  • チャットのプログラムについて

    チャットのプログラムを作ってみようという本を読んだら チャットする2人が、サーバー側とクライアント側に分かれて チャットするプログラムが載っていました。 でも実際にはサーバー側とかクライアント側に分かれていたら 使い勝手が悪いですよね。実際に有名どころのぺたろうや IP Messengerなどはそういうことを気にせずに使えます。 これらのソフトはサーバー側やクライアント側という関係なくして どうやって通信しているのですか? 簡単な説明で良いので教えてください。

  • VB.NETによるTCP通信プログラムについて

    VB.NETによるTCP通信プログラムについて VB.NETによりTCP通信プログラムを開発しようと思っておりますが、TCP通信はクライアントとサーバーに機能が分かれると思いますが、一つのアプリケーションでサーバー機能とクライアント機能を有するアプリケーションは開発が可能でしょうか? サンプルプログラムを探しているのですが、どれも、クライアントとサーバーのどちらかの機能だけですが、両機能を持ち合わせたサンプルを掲載されているサイトをご存じの方は、お手数ですが、教えて頂けると助かります。 ご教授のほど、よろしくお願い致します。 Windows XP SP3 Visual Studio 2008 Visual Basic

  • TCP通信

    OS:Win2000、VisualBasic.netで開発しています。 現在TCP通信のプログラムを製造しています。 TCPサーバとTCPクライアントのテストアプリケーションを作成し、接続テストを行っているのですが、 サーバとクライアントの接続、データ送受信の確認はできました。 しかし、一度クライアント側から接続を切断(ソケットを消去)し、 再びソケットを生成してコネクト要求を出しても接続が確立できません。 このときサーバ側はなにも操作していません。 終始接続待機状態にしてあります。 ソースがないと分かりにくいかもしれませんが、 何か思い当たることがある方、アドバイスよろしくお願いします。

  • Winsockでの送信(TCP)

    Winsockでの送受信プログラムを作成しています。 システム構成としてはサーバーが1つあって、それに複数のPC(クライアント)を接続します。 そしてチャットのようにやりとりを行うプログラムを作成しています。 しかし、チャットと違う点は、文字を、指定した相手(IPで指定)にのみ送信するということです。 自分で調べた結果UDPを用いれば簡単だということを知りました。(sendtoで送信先IPが指定できるから) しかし、TCPのほうが信頼性が高いということでTCPでやりたいと思いました。(勉強にもなるので) どなたかやり方をご教授お願いいたします。

  • TCP/IP通信型プログラムです。作成するのはクライアントです。たとえ

    TCP/IP通信型プログラムです。作成するのはクライアントです。たとえば、サーバから入力を求められ、それが正しくあれば、次の状態へ。正しくなければ、状態を遷移させなかったり。そして、状態が遷移したということをサーバに伝えなければなりません。自分としては、条件式などを利用しようかと思っているのですが・・・。(状態遷移図の作成ではありません。) ほんのわずかなヒントでもいいので、お助け願います。

  • TCP/IP通信型プログラムです。作成するのはクライアントです。たとえ

    TCP/IP通信型プログラムです。作成するのはクライアントです。たとえば、サーバから入力を求められ、それが正しくあれば、次の状態へ。正しくなければ、状態を遷移させなかったり。そして、状態が遷移したということをサーバに伝えなければなりません。自分としては、条件式などを利用しようかと思っているのですが・・・。(状態遷移図の作成ではありません。) ほんのわずかなヒントでもいいので、お助け願います。

  • C#とTCP/IPを利用したサーバープログラム(複数クライアント対応)

    VC#とTCP/IPを利用したサーバープログラムを制作しています。 サーバーとクライアントの1対1での通信には成功したのですが、1つのサーバーで複数のクライアントと通信する方法がわかりません。 同じポート番号を利用できるのでしょうか。ただ単にTcpClientの配列を作ればいいのでしょうか。やはりクライアントの数だけスレッドを作らないといけないのでしょうか。 環境はWindowsVistaでMicrosoft Visual C# 2008 Express Editionを使用しています。 詳しい方がいましたらぜひ具体的なC#でのコード等を教えてください。 よろしくお願いいたします。

  • UDPの接続って?

    Linuxとgccでプログラムしているのですが、 UDPによるデータ送受信で悩んでいます。 (すいません、前回も同じようなこと言いましたね(^^;) TCPであれば、サーバ側は 1.ソケット生成 2.バインド クライアント側は 1.ソケット生成 2.コネクト で通信路が確立されますよね。 UDPはどうなるんでしょうか。コネクションを張らないということは、サーバとクライアントは区別しないんですか? 今現在、TCPのプログラムのSOCK_STREAMとIPROTO_TCPの部分だけをUDPにして実行しているのですが、UDPのくせに Connectとかやってて気分が良くないのです・・・。(笑) 現在は、SetupForClient(サーバ側)とConnectToServer(クライアント側)というTCPの接続関数をそのまま使っています。前者はいいのですが、後者は明らかにUDP向けではないですよね。 もし、クライアント側の例があったら、教えていただければ嬉しく思います。

  • TCPクライアントサーバプログラムで受信したデータを処理するには?

    javaのTCPのクライアントサーバのプログラムでよく見かけると思いますが、データをクライアントもしくはサーバから受け取ったとき、それを表示させるには  cont = true ; while (cont) { try { // 読み込み (サーバorクライアントからのデータ) int n = instr.read(buff); // System.outへの書き出し System.out.write(buff, 0, n) ;                  //↑このデータを使いたい↑ } // 以下は例外処理です catch(Exception e){ // 読み出し終了時にループも終了します cont = false ; } という風にすればできるのですが、読み込んだデータを利用して処理(具体的には文字列(String)として処理したい)するにはどうすればいいのでしょうか? プログラミングに詳しい方教えて頂けないでしょうか?

専門家に質問してみよう