try to handle tcp fragmentation

This commit is contained in:
bdnugget 2025-01-15 10:50:51 +01:00
parent 50952309f4
commit 0b6ab17ad5
2 changed files with 38 additions and 6 deletions

@ -1 +1 @@
Subproject commit 67e08c5d1ea2fe971b862f5621cd738dc85e7350 Subproject commit a48fef0186faffb8f80fb871fcc7612057a063e7

View File

@ -1,6 +1,9 @@
package network package network
import ( import (
"bufio"
"encoding/binary"
"io"
"log" "log"
"net" "net"
"time" "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) { 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) actionTicker := time.NewTicker(types.ClientTickRate)
defer actionTicker.Stop() defer actionTicker.Stop()
@ -76,14 +80,23 @@ func HandleServerCommunication(conn net.Conn, playerID int32, player *types.Play
}() }()
for { for {
n, err := conn.Read(buf) // Read message length (4 bytes)
if err != nil { lengthBuf := make([]byte, 4)
log.Printf("Failed to read from server: %v", err) 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 return
} }
var serverMessage pb.ServerMessage 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) log.Printf("Failed to unmarshal server message: %v", err)
continue 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
}