From 0b6ab17ad5eccdfed12e4dbc8ae34564740e080e Mon Sep 17 00:00:00 2001 From: bdnugget Date: Wed, 15 Jan 2025 10:50:51 +0100 Subject: [PATCH] try to handle tcp fragmentation --- goonserver | 2 +- network/network.go | 42 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/goonserver b/goonserver index 67e08c5..a48fef0 160000 --- a/goonserver +++ b/goonserver @@ -1 +1 @@ -Subproject commit 67e08c5d1ea2fe971b862f5621cd738dc85e7350 +Subproject commit a48fef0186faffb8f80fb871fcc7612057a063e7 diff --git a/network/network.go b/network/network.go index 4a0dcf1..02df028 100644 --- a/network/network.go +++ b/network/network.go @@ -1,6 +1,9 @@ package network import ( + "bufio" + "encoding/binary" + "io" "log" "net" "time" @@ -38,7 +41,8 @@ func ConnectToServer() (net.Conn, int32, error) { } func HandleServerCommunication(conn net.Conn, playerID int32, player *types.Player, otherPlayers map[int32]*types.Player) { - buf := make([]byte, 4096) + // Create a buffered reader for the connection + reader := bufio.NewReader(conn) actionTicker := time.NewTicker(types.ClientTickRate) defer actionTicker.Stop() @@ -76,14 +80,23 @@ func HandleServerCommunication(conn net.Conn, playerID int32, player *types.Play }() for { - n, err := conn.Read(buf) - if err != nil { - log.Printf("Failed to read from server: %v", err) + // 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 + } + 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 } var serverMessage pb.ServerMessage - if err := proto.Unmarshal(buf[:n], &serverMessage); err != nil { + if err := proto.Unmarshal(messageBuf, &serverMessage); err != nil { log.Printf("Failed to unmarshal server message: %v", err) continue } @@ -119,3 +132,22 @@ func HandleServerCommunication(conn net.Conn, playerID int32, player *types.Play } } } + +// Helper function to write length-prefixed messages +func writeMessage(conn net.Conn, msg proto.Message) error { + data, err := proto.Marshal(msg) + if err != nil { + return err + } + + // Write length prefix + lengthBuf := make([]byte, 4) + binary.BigEndian.PutUint32(lengthBuf, uint32(len(data))) + if _, err := conn.Write(lengthBuf); err != nil { + return err + } + + // Write message body + _, err = conn.Write(data) + return err +}