tcp聊天客户端中的同步

时间:2013-04-05 14:33:53

标签: c sockets tcp synchronization fork

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

对于每个客户,任务是:

  1. 提示
  2. 接受用户输入
  3. 将用户写入的消息发送到服务器
  4. 同时,每个客户都需要:

    1. 从服务器接收数据(如果有)
    2. 打印到控制台
    3. 为了实现上述逻辑,我尝试使用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(),但程序每次都表现不同。

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

1 个答案:

答案 0 :(得分:0)

您可能希望使用setbuf(stdout, NULL);stdout关闭(线路)缓冲,看看情况是否更好。