From 3607c4bf36ba6fb8a4d0b4241fd1b122c18aafda Mon Sep 17 00:00:00 2001 From: Colton Staiduhar Date: Sun, 26 Apr 2026 13:44:54 -0400 Subject: [PATCH] working server and gameloop --- .vscode/tasks.json | 2 + Makefile | 2 +- game.h | 11 ++++ gameServer.c | 133 +++++++++++++++++++++++++++++++++++++++++++ main.c | 117 ++----------------------------------- network/networking.c | 3 +- network/networking.h | 4 +- term.c | 38 +++++++++++++ 8 files changed, 194 insertions(+), 116 deletions(-) create mode 100644 gameServer.c create mode 100644 term.c diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 402a134..50b99ae 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -10,6 +10,8 @@ "-g", "main.c", "court.c", + "gameServer.c", + "term.c", "network/*.c", "-o", "netpong", diff --git a/Makefile b/Makefile index 59ef71d..87a9df7 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CC = gcc CFLAGS = -Wall -g -NETPONG_SRC = main.c court.c $(wildcard network/*.c) +NETPONG_SRC = main.c term.c court.c gameServer.c $(wildcard network/*.c) LIBS = -lncurses diff --git a/game.h b/game.h index e1719f6..201cff4 100644 --- a/game.h +++ b/game.h @@ -1,6 +1,9 @@ #ifndef GAME_H #define GAME_H 1 +#include "network/networking.h" + + // Setup game board #define TOP_ROW 4 #define BOT_ROW 21 @@ -16,8 +19,16 @@ typedef struct } GameData; +void SetupTermWin(); +void CloseTermWin(); + +void CreateGameServer(Server* serv,GameData*gd); +void RunGameClient(Client* c); void DrawWalls(GameData); void DrawHeader(GameData); +void MGameAlert(int y, int x, char* str); +void GameAlert(char* str); + #endif \ No newline at end of file diff --git a/gameServer.c b/gameServer.c new file mode 100644 index 0000000..81c561a --- /dev/null +++ b/gameServer.c @@ -0,0 +1,133 @@ +#include "game.h" +#include +#include +#include +#include +#include +#include + +void CreateGameServer(Server* serv, GameData* gd) +{ + + Server s = *serv; + + bool game_running = true; + + fd_set fds; + FD_ZERO(&fds); + FD_SET(s.server_fd, &fds); + + struct timeval tv = { 0, 0 }; // non-blocking check + + SetupTermWin(); + + DrawWalls(*gd); + + while (game_running) { + + fd_set read_fds; + FD_ZERO(&read_fds); + + // Add server socket + FD_SET(s.server_fd, &read_fds); + int max_fd = s.server_fd; + + // Add client sockets + for (int i = 0; i < s.client_count; i++) { + int fd = s.clients[i]; + FD_SET(fd, &read_fds); + if (fd > max_fd) + max_fd = fd; + } + + // Small timeout (prevents 100% CPU usage) + struct timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 1000; // 1ms + + int ret = select(max_fd + 1, &read_fds, NULL, NULL, &tv); + + if (ret < 0) { + perror("select"); + break; + } + + // New connection + if (FD_ISSET(s.server_fd, &read_fds)) { + int client_fd = accept(s.server_fd, NULL, NULL); + if (client_fd >= 0 && s.client_count < MAX_SERVER_CLIENTS) { + s.clients[s.client_count++] = client_fd; + + char msg[64]; + snprintf(msg, sizeof(msg), "New client connected: %d\n", client_fd); + GameAlert(msg); + } + } + + // Handle client data + for (int i = 0; i < s.client_count; i++) { + int fd = s.clients[i]; + + if (FD_ISSET(fd, &read_fds)) { + char buffer[1024]; + int bytes = recv(fd, buffer, sizeof(buffer) - 1, 0); + + if (bytes > 0) { + buffer[bytes] = '\0'; + + char msg[1024]; + snprintf(msg, sizeof(msg), "Client %d says: %s\r", fd, buffer); + GameAlert(msg); + + // Example: echo back + send(fd, buffer, bytes, 0); + } else if (bytes == 0) { + char msg[64]; + snprintf(msg, sizeof(msg), "Client %d disconnected\n", fd); + GameAlert(msg); + + RemoveClient(&s, i); + i--; // re-check swapped client + } else { + perror("recv"); + RemoveClient(&s, i); + i--; + } + } + } + + if (s.client_count < 1) { + char msg[64]; + snprintf(msg, sizeof(msg), "Waiting for other player\n"); + GameAlert(msg); + } else { + // Process Game Data + + } + } + + CloseTermWin(); +} + +void RunGameClient(Client* client) +{ + Client c = *client; + + // char* msg = "Hello from client, this is a test, I really want to see what happens if I create a really long packet and try to send it. I would imagine it will be some kind of buffer overflow"; + // send(c.client_fd, msg, strlen(msg), 0); + + // { + // char buffer[1024] = { 0 }; + // read(c.client_fd, buffer, sizeof(buffer)); + // printf("Server: %s\n", buffer); + // } + + sleep(10); + // char* msg2 = "Ok I am leaving now"; + // send(c.client_fd, msg2, strlen(msg2), 0); + // { + // char buffer[1024] = { 0 }; + // read(c.client_fd, buffer, sizeof(buffer)); + // printf("Server: %s\n", buffer); + // } +} \ No newline at end of file diff --git a/main.c b/main.c index e292b7a..e6d1c24 100644 --- a/main.c +++ b/main.c @@ -1,13 +1,10 @@ #include "game.h" -#include -#include + +#include +#include #include #include #include -#include - -#include "network/networking.h" - /** * Main Fucntion */ @@ -38,130 +35,26 @@ int main(int argc, char* argv[]) return 1; } - // srand(getpid()); - // // Setup Terminal - // if (initscr() == NULL) { - // perror("initscr failed"); - // exit(1); - // } - // noecho(); - // cbreak(); - // nodelay(stdscr, TRUE); - int game_running = true; if (data.host) { // Create Server Server s = StartServer(data.port); - printf("Server Started\n"); - fd_set fds; - FD_ZERO(&fds); - FD_SET(s.server_fd, &fds); - - struct timeval tv = { 0, 0 }; // non-blocking check - - int updateChar = 0; - - while (game_running) { - fd_set read_fds; - FD_ZERO(&read_fds); - - // Add server socket - FD_SET(s.server_fd, &read_fds); - int max_fd = s.server_fd; - - // Add client sockets - for (int i = 0; i < s.client_count; i++) { - int fd = s.clients[i]; - FD_SET(fd, &read_fds); - if (fd > max_fd) - max_fd = fd; - } - - // Small timeout (prevents 100% CPU usage) - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = 1000; // 1ms - - int ret = select(max_fd + 1, &read_fds, NULL, NULL, &tv); - - if (ret < 0) { - perror("select"); - break; - } - - // New connection - if (FD_ISSET(s.server_fd, &read_fds)) { - int client_fd = accept(s.server_fd, NULL, NULL); - if (client_fd >= 0 && s.client_count < s.max_clients) { - s.clients[s.client_count++] = client_fd; - printf("New client connected: %d\n", client_fd); - } - } - - // Handle client data - for (int i = 0; i < s.client_count; i++) { - int fd = s.clients[i]; - - if (FD_ISSET(fd, &read_fds)) { - char buffer[1024]; - int bytes = recv(fd, buffer, sizeof(buffer) - 1, 0); - - if (bytes > 0) { - buffer[bytes] = '\0'; - printf("Client %d says: %s\n", fd, buffer); - - // Example: echo back - send(fd, buffer, bytes, 0); - } else if (bytes == 0) { - printf("Client %d disconnected\n", fd); - RemoveClient(&s, i); - i--; // re-check swapped client - } else { - perror("recv"); - RemoveClient(&s, i); - i--; - } - } - } - - - } + CreateGameServer(&s,&data); close(s.server_fd); } else { printf("Connecting to %s:%i\n", data.domain, data.port); - - // Create Client - Client c = StartClient(data.domain, data.port); - char* msg = "Hello from client"; - send(c.client_fd, msg, strlen(msg), 0); - - { - char buffer[1024] = { 0 }; - read(c.client_fd, buffer, sizeof(buffer)); - printf("Server: %s\n", buffer); - } - - sleep(10); - char* msg2 = "Ok I am leaving now"; - send(c.client_fd, msg2, strlen(msg2), 0); - { - char buffer[1024] = { 0 }; - read(c.client_fd, buffer, sizeof(buffer)); - printf("Server: %s\n", buffer); - } + RunGameClient(&c); close(c.client_fd); return 0; } - - // endwin(); } \ No newline at end of file diff --git a/network/networking.c b/network/networking.c index 00609ef..94d9de9 100644 --- a/network/networking.c +++ b/network/networking.c @@ -7,8 +7,9 @@ #include Server StartServer(int port) { - Server s = {2}; + Server s; s.clientID = 0; + s.client_count = 0; // Create Socket diff --git a/network/networking.h b/network/networking.h index 0186c9c..4b1abde 100644 --- a/network/networking.h +++ b/network/networking.h @@ -3,8 +3,9 @@ #include +#define MAX_SERVER_CLIENTS 2 + typedef struct { - const int max_clients; int server_fd; struct sockaddr_in address; int clients[2]; @@ -20,7 +21,6 @@ typedef struct { struct sockaddr_in address; } Client; - Client StartClient(char* host, int port); #endif \ No newline at end of file diff --git a/term.c b/term.c new file mode 100644 index 0000000..7840838 --- /dev/null +++ b/term.c @@ -0,0 +1,38 @@ +#include "game.h" + +#include +#include +#include +#include + +void SetupTermWin() +{ + srand(getpid()); + + // Setup Terminal + if (initscr() == NULL) { + perror("initscr failed"); + exit(1); + } + noecho(); + cbreak(); + nodelay(stdscr, TRUE); +} + +void CloseTermWin() +{ + endwin(); +} + +void GameAlert(char* str) +{ + MGameAlert(0,0,str); +} + +void MGameAlert(int y, int x, char* str) +{ + move(y, x); + clrtoeol(); + mvaddstr(y, x, str); + refresh(); +}