Чтобы узнать, как использовать сокеты, я работал над простой программой чата командной строки в 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
}
}
Я полагаю, что моя проблема связана с тем, что родитель все еще будет в бесконечном цикле и, в свою очередь, не будет знать о новыхклиентов.