1

C でクライアント サーバー チャット ルームを実装する課題がありますselect()

クライアントがサーバーに接続するとき、ユーザーが実際に に何かを入力しない限り、クライアントは何も送信しませんstdin。ただし、すべてのユーザーにブロードキャストされるか、特に彼に向けられたすべてのメッセージを受信する必要があります。

元。:

  1. C1、C2、C3 が接続され、話している
  2. C4 は接続しますが、何も言いません。C1/2/3 はまだ話している。
  3. C1/2/3 は C4 に関しては何も見えませんが (彼が接続したことを除いて)、C4 は C1/2/3 が接続してから送信しているすべてのメッセージを確認します。

したがって、本質的に、クライアントは読み取り時にブロックする必要がありますが、メッセージを受信する必要があります (かなり矛盾しています!)。私が今考えることができる唯一の方法は、クライアントをマルチスレッド化し、1 つのスレッドを受信用にリッスンし、もう 1 つのスレッドを送信用にすることです。または使用しfork()ます。

私の質問は次のとおりです。上記を で行う簡単な方法はありselect()ますか? たとえば、サーバーへの接続に使用されるソケットstdinを mywrite_fdsと両方に追加し(両方から読み取る必要があるため)、それらを に渡す場合でも、選択はうまくいきますか? TCP は全二重なので、読み取りと書き込みが同時に発生した場合でも問題はないはずですよね?stdinread_fdsselect()

基本的に、私が実装したいのは、すべてのクライアントのための単純な telnet セッションだと思います。そのための提案は大歓迎です。

編集

私が言及しなかったこと:FD_ISSETサーバーが何かを送信したかどうか、およびクライアントが何かを送信したかどうかの両方を確認するために使用できることはよく知っていますが、それらを希望どおりに動作させる方法がわかりません。つまり、送信時に「ブロック」している間に何かを受信する方法がわかりません。おそらくタイマーを追加してselect()、ソケットと標準入力の両方を定期的にポーリングしていますか? 私はそれを試みて、この投稿をさらに編集しますが、それまでの間、提案は大歓迎です.

4

0 に答える 0