Ver Fonte

Trying out stuff with TCP sockets

Aaro Saila há 1 mês atrás
pai
commit
6887fd3168
4 ficheiros alterados com 130 adições e 21 exclusões
  1. 36 3
      src/game/MultiPlayer.c
  2. 2 0
      src/game/MultiPlayer.h
  3. 10 2
      src/game/pong.c
  4. 82 16
      src/server/server.c

+ 36 - 3
src/game/MultiPlayer.c

@@ -35,19 +35,26 @@ MultiPlayer MultiPlayer_alloc(
         .sin_port = htons(server_port)
     };
 
-    mp.conn = connect(
+    res = connect(
         mp.sock,
         (struct sockaddr *) &server_sockaddr,
         sizeof(server_sockaddr)
     );
-    if (mp.conn == -1) {
+    if (res == -1) {
         LOG_FATALF("connect failed: %d %s", errno, strerror(errno));
     }
 
+    mp.conn_s = fdopen(mp.sock, "r+");
+    if (mp.conn_s == nullptr) {
+        LOG_FATALF("fdopen failed: (%d) %s", errno, strerror(errno));
+    }
+
     return mp;
 }
 
 void MultiPlayer_free(MultiPlayer *const mp) {
+    fclose(mp->conn_s);
+    mp->conn_s = nullptr;
     close(mp->conn);
     mp->conn = 0;
     close(mp->sock);
@@ -57,7 +64,33 @@ void MultiPlayer_free(MultiPlayer *const mp) {
 void MultiPlayer_tick(MultiPlayer *const mp) {
     char buf[1024] = { 0 };
     const size_t buf_size = sizeof(buf) / sizeof(buf[0]);
+    printf("Write msg: ");
     fgets(buf, buf_size, stdin);
 
-    send(mp->conn, buf, strlen(buf), 0);
+    const size_t msg_len = strlen(buf) - 1;
+
+    size_t items_written = fwrite(&msg_len, sizeof(msg_len), 1, mp->conn_s);
+    if (items_written < 1) {
+        LOG_FATALF("fwrite failed to write msg_len %zu", items_written);
+    }
+    if (fflush(mp->conn_s) == EOF) {
+        LOG_FATAL("fflush failed at msg_len");
+    }
+    printf("Sent %zu items\n", items_written);
+
+    items_written = fwrite(buf, msg_len, 1, mp->conn_s);
+    if (items_written < 1) {
+        LOG_FATALF("fwrite failed to write msg %zu", items_written);
+    }
+    if (fflush(mp->conn_s) == EOF) {
+        LOG_FATAL("fflush failed at msg");
+    }
+    printf("Sent %zu items\n", items_written);
+
+    // ssize_t res = send(mp->sock, buf, strlen(buf) - 1, 0);
+    // if (res == -1) {
+    //     LOG_ERRORF("send failed: %d %s", errno, strerror(errno));
+    //     return;
+    // }
+    // printf("Sent %zu bytes\n", res);
 }

+ 2 - 0
src/game/MultiPlayer.h

@@ -1,10 +1,12 @@
 #pragma once
 
 #include <stdint.h>
+#include <stdio.h>
 
 typedef struct {
     int sock;
     int conn;
+    FILE *conn_s;
 } MultiPlayer;
 
 MultiPlayer MultiPlayer_alloc(

+ 10 - 2
src/game/pong.c

@@ -28,6 +28,7 @@ int main() {
 
     MainMenu mm = MainMenu_alloc(screen_w, screen_h);
     SinglePlayer sp;
+    MultiPlayer mp;
 
     double last_frame_time = 0.0;
     while (!se_window_should_close()) {
@@ -42,7 +43,8 @@ int main() {
         switch (current_screen) {
         case PONG_MAIN_MENU:
             current_screen = MainMenu_tick(&mm);
-            if (current_screen == PONG_SINGLEPLAYER) {
+            switch (current_screen) {
+            case PONG_SINGLEPLAYER:
                 sp = SinglePlayer_alloc(
                     screen_w,
                     screen_h,
@@ -54,6 +56,12 @@ int main() {
                     ball_pos,
                     ball_speed
                 );
+                break;
+            case PONG_MULTIPLAYER:
+                mp = MultiPlayer_alloc("127.0.0.1", 8080);
+                break;
+            default:
+                break;
             }
             break;
         case PONG_SINGLEPLAYER:
@@ -64,7 +72,7 @@ int main() {
             break;
 
         case PONG_MULTIPLAYER:
-            MultiPlayer_tick();
+            MultiPlayer_tick(&mp);
             break;
         }
 

+ 82 - 16
src/server/server.c

@@ -5,6 +5,7 @@
 #include <netinet/in.h>
 #include <errno.h>
 #include <arpa/inet.h>
+#include <unistd.h>
 
 #include "scufeng/log.h"
 
@@ -32,7 +33,7 @@ int main() {
             .sin_addr = addr,
             .sin_port = htons(SERVER_PORT)
         };
-        res = bind(sock, (struct sockaddr*) &own_addr, sizeof(own_addr));
+        res = bind(sock, (struct sockaddr *) &own_addr, sizeof(own_addr));
         if (res == -1) {
             LOG_FATALF("bind failed: %s", strerror(errno));
         }
@@ -43,28 +44,93 @@ int main() {
         LOG_FATALF("listen failed: %s", strerror(errno));
     }
 
-    int conn = -1;
-
-    conn = accept(sock, nullptr, nullptr);
+    int conn = accept(sock, nullptr, nullptr);
     if (conn == -1) {
         LOG_FATALF("accept failed: %s", strerror(errno));
     }
 
-    char buf[1024] = {0};
-    const size_t buf_size = sizeof(buf) / sizeof(buf[0]);
+    printf("Player connected\n");
+
+    FILE *conn_s = fdopen(conn, "r+");
+    if (conn_s == nullptr) {
+        LOG_FATALF("fdopen failed: (%d) %s", errno, strerror(errno));
+    }
 
     while (true) {
-       int received = recv(conn, buf, buf_size, 0); 
-       if (received == 0) {
-           printf("buf: %s\n", buf);
-           buf[0] = '\0';
-           break;
-       } else if (received == -1) {
-           LOG_FATALF("recv failed: %d %s", errno, strerror(errno));
-       } else {
-           buf[received] = '\0';
-       }
+        printf("Reading msg_len\n");
+        size_t msg_len;
+        size_t bytes_read = fread(&msg_len, sizeof(msg_len), 1, conn_s);
+        if (bytes_read < 1) {
+            LOG_FATALF("fread failed to read msg_len %zu", bytes_read);
+        }
+        printf("msg_len: %zu\n", msg_len);
+
+        printf("\nReading msg\n");
+        char *msg = (char *) malloc(msg_len + 1);
+        bytes_read = fread(msg, msg_len, 1, conn_s);
+        if (bytes_read < 1) {
+            LOG_FATALF("fread failed to read msg %zu", bytes_read);
+        }
+        msg[msg_len] = '\0';
+
+        printf("msg: %s\n\n", msg);
+
+        free(msg);
     }
 
+    fclose(conn_s);
+    close(conn);
+    close(sock);
+
+    // char inter_buf[1024] = {0};
+    // const size_t inter_buf_size = sizeof(inter_buf) / sizeof(inter_buf[0]);
+    //
+    // size_t buf_size = sizeof(char) * 1024;
+    // size_t buf_len = 0;
+    // char *buf = (char *) malloc(buf_size);
+    // if (buf == nullptr) {
+    //     LOG_FATAL("Failed to allocate buf");
+    // }
+    //
+    // while (true) {
+    //     int received = recv(conn, inter_buf, inter_buf_size, 0);
+    //     for (int i = 0; i < received; i++) {
+    //         printf("'%c' ", inter_buf[i]);
+    //     }
+    //     putc('\n', stdout);
+    //     if (received == -1) {
+    //         LOG_FATALF("recv failed: %d %s", errno, strerror(errno));
+    //     } else if (received == 0) {
+    //         printf("Player disconnected\n");
+    //         break;
+    //     } else {
+    //         if (buf_len + received + 1 > buf_size) {
+    //             buf_size *= 2;
+    //             buf = realloc(buf, buf_size);
+    //             if (buf == nullptr) {
+    //                 LOG_FATAL("Failed to increase size of buf");
+    //             }
+    //         }
+    //
+    //         memcpy(buf + buf_len, inter_buf, received);
+    //         buf_len += received;
+    //         buf[buf_len] = '\0';
+    //
+    //         printf("buf: %s\n", buf);
+    //     }
+    //
+    //     // if (received == 0) {
+    //     //     printf("buf: %s\n", buf);
+    //     //     buf[0] = '\0';
+    //     //     break;
+    //     // } else if (received == -1) {
+    //     //     LOG_FATALF("recv failed: %d %s", errno, strerror(errno));
+    //     // } else {
+    //     //     buf[received] = '\0';
+    //     // }
+    //     // printf("loop buf: %s\n", buf);
+    // }
+
+
     return 0;
 }