gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:30:45 25 4
gpt4 key购买 nike

为了学习如何使用套接字,我一直在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com