1

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

对于每个客户,任务是:

  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()and poll(),但程序每次的行为都不同。

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

4

1 回答 1

0

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

于 2013-04-05T15:03:09.510 回答