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
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
}