1
0

server.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/socket.h>
  4. #include <netdb.h>
  5. #include <netinet/in.h>
  6. #include <errno.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h>
  9. #include <fcntl.h>
  10. #include <stdint.h>
  11. #include <stdlib.h>
  12. #include "scufeng/engine.h"
  13. #include "scufeng/log.h"
  14. #include "game.h"
  15. #include "networking.h"
  16. #define SERVER_HOST "127.0.0.1"
  17. #define SERVER_PORT 8080
  18. typedef enum {
  19. SS_LOBBY,
  20. SS_GAME
  21. } ServerState;
  22. static FILE *p1_conn = nullptr;
  23. static FILE *p2_conn = nullptr;
  24. static ServerState server_state = SS_LOBBY;
  25. static void server_lobby(const int sock) {
  26. int player1 = accept(sock, nullptr, nullptr);
  27. if (player1 == -1) {
  28. LOG_FATALF("accept failed: %s", strerror(errno));
  29. }
  30. // if (fcntl(player1, F_SETFL, O_NONBLOCK) != 0) {
  31. // LOG_FATALF("fcntl failed on player1: (%d) %s", errno, strerror(errno));
  32. // }
  33. printf("Player 1 connected\n");
  34. p1_conn = fdopen(player1, "r+");
  35. if (p1_conn == nullptr) {
  36. LOG_FATAL("fdoepn failed for p1");
  37. }
  38. // int player2 = accept(sock, nullptr, nullptr);
  39. // if (player2 == -1) {
  40. // LOG_FATALF("accept failed: %s", strerror(errno));
  41. // }
  42. // if (fcntl(player2, F_SETFL, O_NONBLOCK) != 0) {
  43. // LOG_FATALF("fcntl failed on player2: (%d) %s", errno, strerror(errno));
  44. // }
  45. // printf("Player 2 connected\n");
  46. // p2_conn = fdopen(player2, "r+");
  47. // if (p2_conn == nullptr) {
  48. // LOG_FATAL("fdoepn failed for p2");
  49. // }
  50. }
  51. static void server_game() {
  52. GameState state = GameState_new(game_default_params);
  53. se_fps_lock_set_fps(60);
  54. double last_frame_time_s = 0.0;
  55. while (true) {
  56. const double current_time_s = se_get_time();
  57. const double delta = current_time_s - last_frame_time_s;
  58. se_fps_lock_frame_start_s(current_time_s);
  59. // Player input
  60. uint8_t buf[PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE];
  61. if (!recv_msg(p1_conn, buf, PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE)) {
  62. LOG_FATAL("Failed to receive message");
  63. }
  64. PaddleChangeDirMsg msg = PaddleChangeDir_decode(buf, PADDLE_CHANGE_DIR_MSG_ENCODED_SIZE);
  65. SEDirection dir = (SEDirection) msg.dir;
  66. bool player1 = (bool) msg.player1;
  67. if (player1) {
  68. const char *dir_str = dir == SE_UP ? "UP" : (dir == SE_DOWN ? "DOWN" : (dir == SE_NONE ? "NONE" : "INVALID"));
  69. printf("Player 1 moves paddle to direction: %s\n", dir_str);
  70. } else {
  71. printf("Message was not from player1\n");
  72. }
  73. // Tick
  74. GameState_update(&state, delta);
  75. // Player output
  76. // Wait
  77. se_fps_lock_wait();
  78. }
  79. }
  80. int main() {
  81. se_init(true);
  82. struct protoent *proto = getprotobyname("tcp");
  83. if (proto == nullptr) {
  84. LOG_FATAL("getprotobyname failed");
  85. }
  86. const int sock = socket(AF_INET, SOCK_STREAM, proto->p_proto);
  87. if (sock == -1) {
  88. LOG_FATALF("socket failed: %s", strerror(errno));
  89. }
  90. {
  91. int val = 1;
  92. val = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
  93. if (val != 0) {
  94. LOG_FATALF("setsockopt failed: (%d) %s", errno, strerror(errno));
  95. }
  96. }
  97. {
  98. struct in_addr addr;
  99. int res = inet_aton(SERVER_HOST, &addr);
  100. if (res == 0) {
  101. LOG_FATAL("inet_aton failed");
  102. }
  103. struct sockaddr_in own_addr = {
  104. .sin_family = AF_INET,
  105. .sin_addr = addr,
  106. .sin_port = htons(SERVER_PORT)
  107. };
  108. res = bind(sock, (struct sockaddr *) &own_addr, sizeof(own_addr));
  109. if (res == -1) {
  110. LOG_FATALF("bind failed: %s", strerror(errno));
  111. }
  112. }
  113. int res = listen(sock, 5);
  114. if (res == -1) {
  115. LOG_FATALF("listen failed: %s", strerror(errno));
  116. }
  117. while (true) {
  118. switch (server_state) {
  119. case SS_LOBBY:
  120. server_lobby(sock);
  121. server_state = SS_GAME;
  122. break;
  123. case SS_GAME:
  124. server_game();
  125. break;
  126. }
  127. }
  128. // printf("Player connected\n");
  129. //
  130. // FILE *conn_s = fdopen(conn, "r+");
  131. // if (conn_s == nullptr) {
  132. // LOG_FATALF("fdopen failed: (%d) %s", errno, strerror(errno));
  133. // }
  134. //
  135. // while (true) {
  136. // printf("Reading msg_len\n");
  137. // size_t msg_len;
  138. // size_t bytes_read = fread(&msg_len, sizeof(msg_len), 1, conn_s);
  139. // if (bytes_read < 1) {
  140. // LOG_FATALF("fread failed to read msg_len %zu", bytes_read);
  141. // }
  142. // printf("msg_len: %zu\n", msg_len);
  143. //
  144. // printf("\nReading msg\n");
  145. // char *msg = (char *) malloc(msg_len + 1);
  146. // bytes_read = fread(msg, msg_len, 1, conn_s);
  147. // if (bytes_read < 1) {
  148. // LOG_FATALF("fread failed to read msg %zu", bytes_read);
  149. // }
  150. // msg[msg_len] = '\0';
  151. //
  152. // printf("msg: %s\n\n", msg);
  153. //
  154. // free(msg);
  155. // }
  156. //
  157. // fclose(conn_s);
  158. // close(conn);
  159. // close(sock);
  160. // char inter_buf[1024] = {0};
  161. // const size_t inter_buf_size = sizeof(inter_buf) / sizeof(inter_buf[0]);
  162. //
  163. // size_t buf_size = sizeof(char) * 1024;
  164. // size_t buf_len = 0;
  165. // char *buf = (char *) malloc(buf_size);
  166. // if (buf == nullptr) {
  167. // LOG_FATAL("Failed to allocate buf");
  168. // }
  169. //
  170. // while (true) {
  171. // int received = recv(conn, inter_buf, inter_buf_size, 0);
  172. // for (int i = 0; i < received; i++) {
  173. // printf("'%c' ", inter_buf[i]);
  174. // }
  175. // putc('\n', stdout);
  176. // if (received == -1) {
  177. // LOG_FATALF("recv failed: %d %s", errno, strerror(errno));
  178. // } else if (received == 0) {
  179. // printf("Player disconnected\n");
  180. // break;
  181. // } else {
  182. // if (buf_len + received + 1 > buf_size) {
  183. // buf_size *= 2;
  184. // buf = realloc(buf, buf_size);
  185. // if (buf == nullptr) {
  186. // LOG_FATAL("Failed to increase size of buf");
  187. // }
  188. // }
  189. //
  190. // memcpy(buf + buf_len, inter_buf, received);
  191. // buf_len += received;
  192. // buf[buf_len] = '\0';
  193. //
  194. // printf("buf: %s\n", buf);
  195. // }
  196. //
  197. // // if (received == 0) {
  198. // // printf("buf: %s\n", buf);
  199. // // buf[0] = '\0';
  200. // // break;
  201. // // } else if (received == -1) {
  202. // // LOG_FATALF("recv failed: %d %s", errno, strerror(errno));
  203. // // } else {
  204. // // buf[received] = '\0';
  205. // // }
  206. // // printf("loop buf: %s\n", buf);
  207. // }
  208. return 0;
  209. }