我的应用程序是一个多用户聊天室。服务器只是将接收到的消息发送给所有客户端(回显给所有客户端,包括收到消息的来源)。
对于每个客户,任务是:
- 提示
- 接受用户输入
- 将用户编写的消息发送给服务器
同时,每个客户需要:
- 从服务器接收数据(如果有的话)
- 打印到控制台
为了实现上述逻辑,我尝试使用 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()
,但每次程序的行为都不同。
当未收到进入回显消息的第一条消息时,它从下一条消息收到最后一条消息。因此当有多个用户时它会搞砸。
最佳答案
您可能喜欢使用 setbuf(stdout, NULL);
关闭 stdout
的(行)缓冲,看看情况是否更好。
关于c - tcp 聊天客户端中的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15836622/