我的应用程序是一个多用户聊天室。服务器只是将接收到的消息发送给所有客户端(回显到所有客户端,包括接收消息来源的客户机)。
对于每个客户端,任务如下:
同时,每个客户需要:
为了实现上述逻辑,我尝试使用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。当客户端输入下一条消息时,将打印最后一条消息。
当多个用户连接时,程序的行为不一致。它将接收到的消息堆叠起来,并将它们全部打印在一行中。
我试着使用select()和poll(),但是每次程序的行为都不同。
当进入回显的第一条消息未被接收时,从下一条消息到最后一条消息。因此,当有多个用户时,它就会把它搞砸。
发布于 2013-04-05 15:03:09
您可能希望使用setbuf(stdout, NULL);关闭stdout的(行)缓冲,看看情况是否更好。
https://stackoverflow.com/questions/15836622
复制相似问题