私のアプリケーションはマルチユーザー チャット ルームです。サーバーは、受信したメッセージをすべてのクライアントに送信するだけです (受信したメッセージの発信元を含むすべてのクライアントにエコーされます)。
クライアントごとのタスクは次のとおりです。
- 促す
- ユーザー入力を受け取る
- ユーザーが書いたメッセージをサーバーに送信する
同時に、各クライアントは次のことを行う必要があります。
- サーバーからデータを受信する (存在する場合)
- コンソールに出力
上記のロジックを実装するために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()
たが、プログラムの動作が毎回異なります。
エコーされたメッセージに入る最初のメッセージが受信されず、次のメッセージから最後のメッセージが受信された場合。したがって、複数のユーザーがいる場合は混乱します。