c++ - 向所有客户端发送消息

标签 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
    }
}

我认为我的问题是由于父级仍处于无限循环中,进而不知道新客户。

最佳答案

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

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

一个好的解决方案是使用selectboost.asio 并且不要 fork 服务器进程。

关于c++ - 向所有客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5609096/

相关文章:

python - 跟踪 Linux 套接字调用?

Java - 如果用户意外关闭程序,try-with-resources 会调用 .close() 吗?

c++ - const vs non-const 变量,赋值后值不变

sockets - unix 套接字上的原子写入?

java - 服务器套接字 - 发送测试消息来检测连接

c++ - 使用 select() 请求/回复服务器。无法写回客户端

c++ - 在 Catch2 中指定外部文本文件路径的最佳方式

c++ - printf 的奇怪情况

c++ - 在图像扫描上下文中了解嵌套数组C++

c++ - C++ 中括号和逗号表达式中类型的计算顺序 (x0 = y0, x1 = y1, x2 = x0, ...)