アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語(unix環境)でチャットプログラミングを作りたいのですが、まずは、TCP/IPによるマルチクライアントで簡単なメッセージのやりとりができるプログラムを練習として作りたいと考えています。
そこでサーバにクライアントからメッセージが届いた時点で全クライアントにメッセージを送信(write)し、逐次更新されるようにしたいのですが、クライアント側で常にread関数を呼び出すのは非常に不格好だし、メッセージを入力するといった他の処理ができなくなると思うのです。
何か方法はありますでしょうか?
なにぶんネットワークプログラミングは始めたばかりですので初心者向けの解説をお願いします。

A 回答 (3件)

マルチスレッドを使う手もありますが、ネットワークの基本はselectでしょう。



クライアントではサーバからの更新データとユーザからの入力の2つを同時に待つ必要がありますが、サーバも複数のクライアントからの通信を同時に待つ必要があります。
このように複数の待ちを同時に実行する場合、selectを使います。詳細な使い方はマニュアルなどを参照してください。
    • good
    • 0

解決法は、4つほどあります。

参考になれば幸いです。
(1)read関数をノンブロッキングにする。
 ->read関数を呼び出しても、データ到達なしなら即リターンする。
 キーワード:O_NONBLOCK

(2)割込みを使用する。
 ->データ到達時に割込み処理がはしってくれるので常に待つ必要なし。
 キーワード:sigaction, SIGIO

(3)selectを使用する。
 ->ターミナル上でのチャットプログラムならこれでOKでしょう。
  (ソケット以外にもキーボード入力も感知できるので)
 キーワード:特に無し。

(4)スレッドを使用する。
 ->スレッドの中でreadすればメインのほうは、別処理ができる。
 キーワード:pthread

GUI使用するなら(2)か(4)でしょう。
    • good
    • 1

最近Windows下で似たようなことをやりましたが、参考になる……かな?


マルチスレッドは出来ないでしょうか
入力~送信と受信~表示を別のスレッドに分けてしまえばいいと思うのですが、いかがでしょう。

参考URL:http://www.google.co.jp/search?q=UNIX+C%8C%BE%8C …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!