要学习如何使用套接字,我一直在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
}
}
我认为我的问题是由于父母仍然处于无限循环而又不知道新客户的事实。
答案 0 :(得分:4)
当您fork
进程时,如果有数据,则会获得一个全新的副本。具体来说,每个服务器进程都有自己的connectedClients
副本,该副本具有fork
时父进程的值。如果服务器父进程稍后更新connectedClients
,则当时存在的服务器子进程将永远不会知道。
尝试从您的子服务器进程打印connectedClients
的值,看看我的意思。
一个好的解决方案是使用select
或boost.asio
,而不是分叉服务器进程。