From 0cd3145d28c52d11cb59bcc1097b3317472f2306 Mon Sep 17 00:00:00 2001 From: bdnugget Date: Wed, 15 Jan 2025 10:58:11 +0100 Subject: [PATCH] try to handle tcp fragmentation --- goonserver | 2 +- network/network.go | 28 ++++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/goonserver b/goonserver index a48fef0..23474c1 160000 --- a/goonserver +++ b/goonserver @@ -1 +1 @@ -Subproject commit a48fef0186faffb8f80fb871fcc7612057a063e7 +Subproject commit 23474c19dc152d730bb554040a92d0b5a8ec59e9 diff --git a/network/network.go b/network/network.go index 02df028..deba00b 100644 --- a/network/network.go +++ b/network/network.go @@ -22,15 +22,25 @@ func ConnectToServer() (net.Conn, int32, error) { } log.Println("Connected to server. Waiting for player ID...") - buf := make([]byte, 1024) - n, err := conn.Read(buf) - if err != nil { - log.Printf("Error reading player ID from server: %v", err) + reader := bufio.NewReader(conn) + + // Read message length (4 bytes) + lengthBuf := make([]byte, 4) + if _, err := io.ReadFull(reader, lengthBuf); err != nil { + log.Printf("Failed to read message length: %v", err) + return nil, 0, err + } + messageLength := binary.BigEndian.Uint32(lengthBuf) + + // Read the full message + messageBuf := make([]byte, messageLength) + if _, err := io.ReadFull(reader, messageBuf); err != nil { + log.Printf("Failed to read message body: %v", err) return nil, 0, err } var response pb.ServerMessage - if err := proto.Unmarshal(buf[:n], &response); err != nil { + if err := proto.Unmarshal(messageBuf, &response); err != nil { log.Printf("Failed to unmarshal server response: %v", err) return nil, 0, err } @@ -63,13 +73,7 @@ func HandleServerCommunication(conn net.Conn, playerID int32, player *types.Play player.ActionQueue = player.ActionQueue[:0] player.Unlock() - data, err := proto.Marshal(batch) - if err != nil { - log.Printf("Failed to marshal action batch: %v", err) - continue - } - - if _, err = conn.Write(data); err != nil { + if err := writeMessage(conn, batch); err != nil { log.Printf("Failed to send actions to server: %v", err) return }