为了学习如何使用套接字,我一直在 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
的值,看看我的意思。
一个好的解决方案是使用select
或boost.asio
并且不要 fork 服务器进程。
关于c++ - 向所有客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5609096/