c - tcp 聊天客户端中的同步

标签 c sockets tcp synchronization fork

我的应用程序是一个多用户聊天室。服务器只是将接收到的消息发送给所有客户端(回显给所有客户端,包括收到消息的来源)。

对于每个客户,任务是:

  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 没有被打印出来。当客户端输入下一条消息时,打印最后一条消息。

当连接了多个用户时,程序的行为会不一致。它将收到的消息堆叠起来并在一行中打印出来。

我尝试使用 select()poll(),但每次程序的行为都不同。

当未收到进入回显消息的第一条消息时,它从下一条消息收到最后一条消息。因此当有多个用户时它会搞砸。

最佳答案

您可能喜欢使用 setbuf(stdout, NULL); 关闭 stdout 的(行)缓冲,看看情况是否更好。

关于c - tcp 聊天客户端中的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15836622/

相关文章:

ios - 如何在 Xcode 11 包管理器中处理 C 文件?

使用 argp 库完全隐藏选项

node.js - 如何从socket.io服务器向特定客户端发送请求?

php - 我可以从特定 IP(如果机器有两个 IP)在 PHP 中打开套接字吗?

c++ - rpc 和普通 tcp/udp 服务器客户端程序的区别?

c - 将地址分配给 C 中定义的函数指针

java - Apache Mina 空闲监视器

networking - 被拒绝的 tcp 连接不返回错误

python - 以编程方式发现公共(public) IP

c - 为全局多维数组分配内存