向所有客户发送消息

时间:2011-04-10 01:14:43

标签: c++ sockets

要学习如何使用套接字,我一直在OS X中开发一个简单的命令行聊天程序。

我的程序目标是让它工作,这样当一个客户端发送消息时,服务器会将消息中继回所有客户端。

但是,在测试时,服务器会将较新客户端的消息发送给较旧的客户端,但不会将消息从较旧的客户端发送到较新的客户端。

这是我正在使用的循环:

while (1) {

    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clientLength);
    if (newsockfd < 0) error("Error accepting");

    connectedClients++;

    std::cout << "Client connected\n"; 

    pid = fork();
    if (pid > 0) {
        // parent; do nothing
    } else if (pid == 0) {
        // child
        close(sockfd);
        while(1) {
          // read data 

          // send data
          for (int i=minClient; i<=connectedClients;i++)
              int n = write(newsockfd, buffer, strlen(buffer)); 
        }
    } else {
        // Error
    }
}

我认为我的问题是由于父母仍然处于无限循环而又不知道新客户的事实。

1 个答案:

答案 0 :(得分:4)

当您fork进程时,如果有数据,则会获得一个全新的副本。具体来说,每个服务器进程都有自己的connectedClients副本,该副本具有fork时父进程的值。如果服务器父进程稍后更新connectedClients,则当时存在的服务器子进程将永远不会知道。

尝试从您的子服务器进程打印connectedClients的值,看看我的意思。

一个好的解决方案是使用selectboost.asio,而不是分叉服务器进程。