Advertisement
Guest User

game_thread_server.c

a guest
Feb 17th, 2022
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <netdb.h>
  4. #include <arpa/inet.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include <sys/wait.h>
  10. #include <signal.h>
  11. #include <time.h>
  12. #include <pthread.h>
  13.  
  14. #define MSG_LEN 256
  15. #define MAX_K 65535
  16. #define PLAYERS 4
  17.  
  18. void die(char * f)
  19. {
  20. perror(f);
  21. exit(1);
  22. }
  23.  
  24. struct sockaddr_in setup_addr(int port)
  25. {
  26. struct sockaddr_in server_address;
  27.  
  28. server_address.sin_family = AF_INET;
  29. server_address.sin_port = htons(port);
  30. server_address.sin_addr.s_addr =
  31. htonl(INADDR_ANY); // htonl seems unecessary
  32.  
  33. return(server_address);
  34. }
  35.  
  36. void * play_game(void * s)
  37. {
  38. int ** clients = (int **) s;
  39.  
  40. srand (time(NULL));
  41. int k = rand() % MAX_K;
  42. int tries = 3;
  43. char *messages[6] = {"PLUS \n","MOINS \n","GAGNE\n","PERDU\n", "DEBUT\n",
  44. "K?:\n"};
  45. int turn = 0;
  46.  
  47. for (int i = 0; i < PLAYERS; i++)
  48. {
  49. printf("s%d: %d\n", i, *clients[i]);
  50. }
  51.  
  52. for (int i = 0; i < PLAYERS; i++)
  53. send(*clients[i], messages[4], strlen(messages[4]), 0);
  54.  
  55. while (tries != 0)
  56. {
  57. turn %= PLAYERS;
  58.  
  59. int guess;
  60.  
  61. char msg[MSG_LEN];
  62.  
  63. if (send(*clients[turn], messages[5], strlen(messages[5]), 0) < 0)
  64. die("send");
  65.  
  66. if ((recv(*clients[turn], &msg, MSG_LEN, 0) < 0)) die("recv");
  67.  
  68. guess = atoi(msg);
  69.  
  70. printf("Player: %d\n", turn);
  71. printf("Josef K.: %d\n", k);
  72. printf("message: %d\n", guess);
  73.  
  74. if (guess < k) {
  75. if (turn == PLAYERS - 1)
  76. --tries;
  77. send(*clients[turn], messages[0], strlen(messages[0]), 0);
  78. }
  79. else if (guess > k) {
  80. if (turn == PLAYERS - 1)
  81. --tries;
  82. send(*clients[turn], messages[1], strlen(messages[1]), 0);
  83. }
  84. else if (guess == k) {
  85. send(*clients[turn], messages[2], strlen(messages[2]), 0);
  86. close(*clients[turn]);
  87. break;
  88. }
  89. turn++;
  90. }
  91.  
  92. for (int i = 0; i < PLAYERS; i++) {
  93. send(*clients[i], messages[3], strlen(messages[3]), 0);
  94. close(*clients[i]);
  95. }
  96.  
  97. pthread_exit(NULL);
  98. return (NULL);
  99. }
  100.  
  101. int main(int argc, char ** argv)
  102. {
  103. int ** clients;
  104. int server_sock;
  105.  
  106. struct sockaddr_in server_addr;
  107. struct sockaddr_in client_address;
  108.  
  109. socklen_t size = sizeof(client_address);
  110.  
  111. server_sock = socket(AF_INET, SOCK_STREAM, 0);
  112. server_addr = setup_addr(1337);
  113.  
  114. int so_reuseaddr = 1;
  115.  
  116. setsockopt(server_sock ,SOL_SOCKET,SO_REUSEADDR,
  117. &so_reuseaddr,
  118. sizeof so_reuseaddr);
  119.  
  120. if (bind(server_sock, (struct sockaddr *)&server_addr,
  121. sizeof(server_addr)) < 0) die("Socket bind failed");
  122.  
  123.  
  124. if (listen(server_sock, 1) != 0) die("Failed to listen");
  125.  
  126. clients = malloc(sizeof(int *) * PLAYERS);
  127.  
  128. while (1)
  129. {
  130. for (int i = 0; i < PLAYERS; i++) {
  131. clients[i] = malloc(sizeof(int));
  132. *clients[i] = accept(server_sock,
  133. (struct sockaddr *)&client_address, &size);
  134. printf("s%d: %d\n", i, *clients[i]);
  135. }
  136.  
  137. pthread_t th;
  138. if (pthread_create(&th, NULL, play_game, clients) < 0)
  139. die("create thread");
  140. }
  141.  
  142.  
  143. for (int i = 0; i < PLAYERS; i++) free(clients[i]);
  144. free(clients);
  145. close(server_sock);
  146. return(0);
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement