0

複数のクライアントが接続するクライアントサーバーチャットプログラムのクライアント側の実装に問題があります。問題は、私が遭遇しているのは、(別のクライアントへのチャットメッセージ)と受信(別のクライアントからのチャットメッセージ)を同時にどの程度正確に行う必要があるかということです。何が起こっているのかというと、私は常にデータを送信していて、決して読み取っていないということです。フォークして、一方を読み取り、もう一方を送信する必要がありますか?

これが関連するコードです

クライアント側

while(1) {

  fd_set rfds, wfds;
  FD_ZERO(&rfds);
  FD_ZERO(&wfds);

  FD_SET(serverSocket, &rfds);
  FD_SET(serverSocket, &wfds);

  if(select(serverSocket+1, &rfds, &wfds, NULL, NULL) < 0) {
      perror("select");
      exit(-1);
  }

  if (FD_ISSET(serverSocket, &rfds)) {
     // we got data, read it
  }
  if (FD_ISSET(serverSocket, &wfds)) {
     printf(">");

     // read keyboard
     sendLen = 0;
     while ((cmd[sendLen] = getchar()) != '\n')
        sendLen++;
     cmd[sendLen] = '\0';

     // send the data
  }
}
4

1 に答える 1

1

ファイル記述子 0 (標準入力) も選択に入れ、char を読み取ってそれらをバッファリングし、ソケットが書き込み可能になったら、バッファ全体をコピーする必要があります。このようにして、標準入力での読み取りを常にブロックするだけです。

追加

FD_SET(0, &rfds);

そのため、ユーザーが何かを入力すると、選択も返されます。

stdin をノンブロッキングとして設定するには、fcntl も使用する必要があります。次に、selectがstdinにデータがあることを通知するたびに、次のようにします。

while(read(0,buffer+filled,1)>0) {}

バッファーがいっぱいになった場合にループを終了する別の条件を追加してください。

次に、ソケットに書き込むことができるときに、バッファーにあるバイト数のサイズの送信を行い、すべてが書き込まれたかどうかを確認するか、残りのバイトをバッファーの先頭に移動します。

その while(getchar()) は、メッセージを受信できないようにブロックしています。

于 2013-02-09T23:47:44.333 に答える