В настоящее время я использую сокет для написания сервера игры в кости для работы с несколькими клиентами, каждый раз, когда сервер начинает новый раунд игры (клиентов должно быть не менее 3), должно быть два случайных кубика, брошенных для получения двухслучайный int
между 1-6, и клиентская сторона должна угадать решение и отправить его на сервер.
Я сталкиваюсь с логической проблемой: я использую функцию fork()
для обработки несколькихклиенты, каждый раунд игры должен быть циклом while, но в то же время цикл продолжает получать соединения, что означает, что каждый раз, когда запускается функция game_round()
(бросьте два кубика), программа все еще может получать соединения.
У меня вопрос: как я могу изменить свой код, чтобы игра запускалась, только если количество клиентов не менее 3, а затем выполнять следующие шаги для каждого дочернего процесса, пока не будет только один клиент.
Логика игры такова:
Бросьте две кубики, чтобы получить решение.
client1 отправляет предположение на сервер, client2 отправляетугадать на сервер, клиенты3 отправляет .........
Сервер получает догадки и проверяет, если client1 не так, живет-1, если правильно, ничего не делает и отправляетвозвращает информацию клиенту.
Возвращайтесь к шагу 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;
}
}