Логическая проблема использования fork () для обработки нескольких клиентов в сокете в c - PullRequest
0 голосов
/ 29 апреля 2019

В настоящее время я использую сокет для написания сервера игры в кости для работы с несколькими клиентами, каждый раз, когда сервер начинает новый раунд игры (клиентов должно быть не менее 3), должно быть два случайных кубика, брошенных для получения двухслучайный int между 1-6, и клиентская сторона должна угадать решение и отправить его на сервер.

Я сталкиваюсь с логической проблемой: я использую функцию fork() для обработки несколькихклиенты, каждый раунд игры должен быть циклом while, но в то же время цикл продолжает получать соединения, что означает, что каждый раз, когда запускается функция game_round() (бросьте два кубика), программа все еще может получать соединения.

У меня вопрос: как я могу изменить свой код, чтобы игра запускалась, только если количество клиентов не менее 3, а затем выполнять следующие шаги для каждого дочернего процесса, пока не будет только один клиент.

Логика игры такова:

  1. Бросьте две кубики, чтобы получить решение.

  2. client1 отправляет предположение на сервер, client2 отправляетугадать на сервер, клиенты3 отправляет .........

  3. Сервер получает догадки и проверяет, если client1 не так, живет-1, если правильно, ничего не делает и отправляетвозвращает информацию клиенту.

  4. Возвращайтесь к шагу 1, пока не останется только один клиент, который станет победителем.

Вот часть моегокод сервера:

    while(1){

           // Roll the dice
           game_round();

           socklen_t client_len = sizeof(client);
           client_fd = accept(server_fd, (struct sockaddr *) &client,                        &client_len);
           if(client_fd<0)
           {
                perror("connection error");
                exit(1);
           }

           printf("new client accepted.\n");

           if(childid=fork()==0)//child process
           {
                printf("child process: %d created.\n", getpid());
                printf("\n" );
                close(server_fd);// close listening

                // receive INIT and send information back
                init(client_fd, info);

                sleep(2);

                // send game begun message
                begun(client_fd);

                sleep(2);

                //send guess information
                guess(client_fd);

                sleep(2);

                //receive client's moves and process
                recv_proce_move(client_fd, move);

                check(info, round, move);

                sleep(2);

                // send lives back to clients, if lives is 0, close 
                   the child process
                // if the client's live is 0, close the connection
                send_lives(client_fd, move, info);
          }
          if(childid == 0){
               printf("game over");
               break;
          }
     }

1 Ответ

0 голосов
/ 29 апреля 2019

Вам нужно будет поместить ваши сокеты во что-то вроде функции select ().Функция выбора позволяет вам блокировать и ожидать события в нескольких сокетах и ​​файловых дескрипторах одновременно.

Вот хороший пример: https://www.gnu.org/software/libc/manual/html_node/Server-Example.html

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