1

私のアプリケーションはマルチユーザー チャット ルームです。サーバーは、受信したメッセージをすべてのクライアントに送信するだけです (受信したメッセージの発信元を含むすべてのクライアントにエコーされます)。

クライアントごとのタスクは次のとおりです。

  1. 促す
  2. ユーザー入力を受け取る
  3. ユーザーが書いたメッセージをサーバーに送信する

同時に、各クライアントは次のことを行う必要があります。

  1. サーバーからデータを受信する (存在する場合)
  2. コンソールに出力

上記のロジックを実装するためにfork()、次のように使用してみました:

pid = fork();
if(!fork()){
    while(1){
        memset(recvmsg,0,RCVBUFSIZE);
        read(conn_s, recvmsg, RCVBUFSIZE);
        printf("\n>%s",recvmsg);         
    }
}
else{
    while(1){
        printf("\n%d> ", conn_s);
        memset(msg,0,RCVBUFSIZE);
        fgets(msg, RCVBUFSIZE, stdin); 

        strrep(msg,'\n','\0');
        write(conn_s, msg, strlen(msg));

        if( strcmp(msg,"quit") == 0){
            kill(pid, SIGKILL);
            exit(0);
        }
    }
}

問題は、最初のクライアントがエコーバックされたメッセージを入力した後、msg印刷されないことです。クライアントが次のメッセージを入力すると、最後のメッセージが出力されます。

複数のユーザーが接続している場合、プログラムは一貫性のない動作をします。受信したメッセージを積み重ねて、すべてを 1 行に出力します。

と を使用してみselect()ましpoll()たが、プログラムの動作が毎回異なります。

エコーされたメッセージに入る最初のメッセージが受信されず、次のメッセージから最後のメッセージが受信された場合。したがって、複数のユーザーがいる場合は混乱します。

4

1 に答える 1

0

setbuf(stdout, NULL);(ライン) バッファリングをオフにして、stdout見た目が良くなるかどうかを確認するために使用したい場合があります。

于 2013-04-05T15:03:09.510 に答える