require header match
All checks were successful
Build and Publish / BuildAndDeployAmd64 (push) Successful in 27s
Build and Publish / BuildAndDeploy (push) Successful in 2m16s

This commit is contained in:
matst80
2024-11-12 22:31:19 +01:00
parent 438358e4b3
commit e1b254668f
6 changed files with 52 additions and 7 deletions

View File

@@ -31,11 +31,44 @@ type Packet struct {
StatusCode uint32 StatusCode uint32
} }
var headerData = make([]byte, 4)
func matchHeader(conn io.Reader) error {
pos := 0
for pos < 4 {
l, err := conn.Read(headerData)
if err != nil {
return err
}
for i := 0; i < l; i++ {
if headerData[i] == header[pos] {
pos++
if pos == 4 {
return nil
}
} else {
pos = 0
}
}
}
return nil
}
func ReadPacket(conn io.Reader, packet *Packet) error { func ReadPacket(conn io.Reader, packet *Packet) error {
err := matchHeader(conn)
if err != nil {
return err
}
return binary.Read(conn, binary.LittleEndian, packet) return binary.Read(conn, binary.LittleEndian, packet)
} }
func ReadCartPacket(conn io.Reader, packet *CartPacket) error { func ReadCartPacket(conn io.Reader, packet *CartPacket) error {
err := matchHeader(conn)
if err != nil {
return err
}
return binary.Read(conn, binary.LittleEndian, packet) return binary.Read(conn, binary.LittleEndian, packet)
} }

View File

@@ -48,7 +48,7 @@ func NewCartTCPClient(address string) (*CartTCPClient, error) {
} }
func (m *CartTCPClient) SendPacket(messageType CartMessage, id CartId, data []byte) error { func (m *CartTCPClient) SendPacket(messageType CartMessage, id CartId, data []byte) error {
m.Conn.Write(header[:])
err := binary.Write(m.Conn, binary.LittleEndian, CartPacket{ err := binary.Write(m.Conn, binary.LittleEndian, CartPacket{
Version: CurrentPacketVersion, Version: CurrentPacketVersion,
MessageType: messageType, MessageType: messageType,

View File

@@ -70,7 +70,7 @@ func (m *TCPCartServerMux) handleFunction(connection net.Conn, messageType CartM
m.mu.RUnlock() m.mu.RUnlock()
if ok { if ok {
responseType, responseData, err := fn(id, data) responseType, responseData, err := fn(id, data)
connection.Write(header[:])
if err != nil { if err != nil {
errData := []byte(err.Error()) errData := []byte(err.Error())
err = binary.Write(connection, binary.LittleEndian, CartPacket{ err = binary.Write(connection, binary.LittleEndian, CartPacket{
@@ -96,6 +96,8 @@ func (m *TCPCartServerMux) handleFunction(connection net.Conn, messageType CartM
packetsSent.Inc() packetsSent.Inc()
_, err = connection.Write(responseData) _, err = connection.Write(responseData)
return true, err return true, err
} else {
log.Printf("No cart handler for type: %d\n", messageType)
} }
return false, nil return false, nil
} }

View File

@@ -23,23 +23,24 @@ func TestCartTcpHelpers(t *testing.T) {
return nil return nil
}) })
server.HandleCall(666, func(id CartId, data []byte) (CartMessage, []byte, error) { server.HandleCall(666, func(id CartId, data []byte) (CartMessage, []byte, error) {
log.Printf("Received call: %s\n", string(data)) log.Printf("Received 666 call: %s\n", string(data))
return 3, []byte("Hello, client!"), fmt.Errorf("Det blev fel") return 3, []byte("Hello, client!"), fmt.Errorf("Det blev fel")
}) })
server.HandleCall(2, func(id CartId, data []byte) (CartMessage, []byte, error) { server.HandleCall(2, func(id CartId, data []byte) (CartMessage, []byte, error) {
log.Printf("Received call: %s\n", string(data)) log.Printf("Received 2 call: %s\n", string(data))
return 3, []byte("Hello, client!"), nil return 4, []byte("Hello, client!"), nil
}) })
// server.HandleCall(Ping, func(id CartId, data []byte) (CartMessage, []byte, error) { // server.HandleCall(Ping, func(id CartId, data []byte) (CartMessage, []byte, error) {
// return Pong, nil, nil // return Pong, nil, nil
// }) // })
id := ToCartId("kalle") id := ToCartId("kalle")
client.SendPacket(1, id, []byte("Hello, world!")) client.SendPacket(1, id, []byte("Hello, world!"))
answer, err := client.Call(2, id, 3, []byte("Hello, server!")) answer, err := client.Call(2, id, 4, []byte("Hello, server!"))
if err != nil { if err != nil {
t.Errorf("Error calling: %v\n", err) t.Errorf("Error calling: %v\n", err)
} }
s, err := client.Call(666, id, 3, []byte("Hello, server!")) s, err := client.Call(666, id, 3, []byte("Hello, server!"))
client.Close()
if err != nil { if err != nil {
t.Errorf("Error calling: %v\n", err) t.Errorf("Error calling: %v\n", err)
} }

View File

@@ -92,8 +92,14 @@ func NewTCPClient(address string) (*TCPClient, error) {
}, nil }, nil
} }
func (m *TCPClient) SendPacket(messageType PoolMessage, data []byte) error { type PacketHeader [4]byte
var (
header = PacketHeader([4]byte{0x01, 0x02, 0x03, 0x04})
)
func (m *TCPClient) SendPacket(messageType PoolMessage, data []byte) error {
m.Conn.Write(header[:])
err := binary.Write(m.Conn, binary.LittleEndian, Packet{ err := binary.Write(m.Conn, binary.LittleEndian, Packet{
Version: CurrentPacketVersion, Version: CurrentPacketVersion,
MessageType: messageType, MessageType: messageType,

View File

@@ -69,6 +69,7 @@ func (m *TCPServerMux) handleFunction(connection net.Conn, messageType PoolMessa
function, ok := m.functions[messageType] function, ok := m.functions[messageType]
m.mu.RUnlock() m.mu.RUnlock()
if ok { if ok {
connection.Write(header[:])
responseType, responseData, err := function(data) responseType, responseData, err := function(data)
if err != nil { if err != nil {
errData := []byte(err.Error()) errData := []byte(err.Error())
@@ -93,6 +94,8 @@ func (m *TCPServerMux) handleFunction(connection net.Conn, messageType PoolMessa
packetsSent.Inc() packetsSent.Inc()
_, err = connection.Write(responseData) _, err = connection.Write(responseData)
return true, err return true, err
} else {
log.Printf("No pool handler for type: %d\n", messageType)
} }
return false, nil return false, nil
} }