首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tcp聊天客户端的同步

tcp聊天客户端的同步
EN

Stack Overflow用户
提问于 2013-04-05 14:33:52
回答 1查看 225关注 0票数 1

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

对于每个客户端,任务如下:

  1. 提示
  2. 接受用户输入
  3. 将用户编写的消息发送到服务器。

同时,每个客户需要:

  1. 从服务器接收数据(如果有的话)
  2. 打印到控制台

为了实现上述逻辑,我尝试使用fork(),如下所示:

代码语言:javascript
复制
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(),但是每次程序的行为都不同。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-05 15:03:09

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15836622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档