
C言語(unix環境)でチャットプログラミングを作りたいのですが、まずは、TCP/IPによるマルチクライアントで簡単なメッセージのやりとりができるプログラムを練習として作りたいと考えています。
そこでサーバにクライアントからメッセージが届いた時点で全クライアントにメッセージを送信(write)し、逐次更新されるようにしたいのですが、クライアント側で常にread関数を呼び出すのは非常に不格好だし、メッセージを入力するといった他の処理ができなくなると思うのです。
何か方法はありますでしょうか?
なにぶんネットワークプログラミングは始めたばかりですので初心者向けの解説をお願いします。
No.2ベストアンサー
- 回答日時:
マルチスレッドを使う手もありますが、ネットワークの基本はselectでしょう。
クライアントではサーバからの更新データとユーザからの入力の2つを同時に待つ必要がありますが、サーバも複数のクライアントからの通信を同時に待つ必要があります。
このように複数の待ちを同時に実行する場合、selectを使います。詳細な使い方はマニュアルなどを参照してください。
No.3
- 回答日時:
解決法は、4つほどあります。
参考になれば幸いです。(1)read関数をノンブロッキングにする。
->read関数を呼び出しても、データ到達なしなら即リターンする。
キーワード:O_NONBLOCK
(2)割込みを使用する。
->データ到達時に割込み処理がはしってくれるので常に待つ必要なし。
キーワード:sigaction, SIGIO
(3)selectを使用する。
->ターミナル上でのチャットプログラムならこれでOKでしょう。
(ソケット以外にもキーボード入力も感知できるので)
キーワード:特に無し。
(4)スレッドを使用する。
->スレッドの中でreadすればメインのほうは、別処理ができる。
キーワード:pthread
GUI使用するなら(2)か(4)でしょう。
No.1
- 回答日時:
最近Windows下で似たようなことをやりましたが、参考になる……かな?
マルチスレッドは出来ないでしょうか
入力~送信と受信~表示を別のスレッドに分けてしまえばいいと思うのですが、いかがでしょう。
参考URL:http://www.google.co.jp/search?q=UNIX+C%8C%BE%8C …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
closeされたsocketへの動作につ...
-
Socket通信の0バイト受信について
-
VB6‥ソケットについて
-
UDP通信する時に、相手にどうや...
-
socket.hを入手するには?
-
CreateFile関数でCOMポートが開...
-
ソケットのクローズについて
-
エクセル VBA でのCOMポート...
-
VB6のwinsockでconnectできない
-
どうか、POSTでのファイル転送...
-
Winsockを使わずにVBでSocketを...
-
SIPがNATを越えられない理由
-
UdpClient 送信元のIPアドレ...
-
ネットワークプログラミングに...
-
空きポートの取得方法
-
Macターミナルで実行中のプログ...
-
C# シリアル通信でデータ受信...
-
VBA kernel32 の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
エクセル VBA でのCOMポート...
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
VB6のwinsockでconnectできない
-
Socket通信の0バイト受信について
-
recv関数でフリーズしてしまう
-
Winsockで接続待ちタイムアウト...
-
Connectエラーが出てしまう・・...
-
送信したデータの一部が文字化...
-
【ajax】 XMLHttpRequestオブジ...
-
ソケット通信
-
closeされたsocketへの動作につ...
-
wsdlからのサービス化を行い。
-
Cにおける通信プログラミングの...
-
UdpClient 送信元のIPアドレ...
-
非ブロッキングソケットのrecv...
-
ソケットを用いた1対多通信につ...
おすすめ情報