отправить сообщение всем клиентам - PullRequest
0 голосов
/ 10 апреля 2011

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

Я полагаю, что моя проблема связана с тем, что родитель все еще будет в бесконечном цикле и, в свою очередь, не будет знать о новыхклиентов.

1 Ответ

4 голосов
/ 10 апреля 2011

Когда вы fork обрабатываете, вы получаете совершенно новую копию, если его данные.В частности, каждый серверный процесс имеет свою собственную копию connectedClients, которая имеет значение родительского процесса на момент fork.Если родительский процесс сервера позже обновляет connectedClients, тогда существующие дочерние процессы сервера никогда не узнают.

Попробуйте распечатать значение connectedClients из дочерних процессов сервера, чтобы понять, что я имею в виду.

Хорошее решение - использовать select или boost.asio и не форкать процесс сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...