diff --git a/packet.go b/packet.go index e2273b0..231df19 100644 --- a/packet.go +++ b/packet.go @@ -31,11 +31,44 @@ type Packet struct { 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 { + err := matchHeader(conn) + if err != nil { + return err + } return binary.Read(conn, binary.LittleEndian, packet) } func ReadCartPacket(conn io.Reader, packet *CartPacket) error { + err := matchHeader(conn) + if err != nil { + return err + } return binary.Read(conn, binary.LittleEndian, packet) } diff --git a/tcp-cart-client.go b/tcp-cart-client.go index 36458c1..52adb02 100644 --- a/tcp-cart-client.go +++ b/tcp-cart-client.go @@ -48,7 +48,7 @@ func NewCartTCPClient(address string) (*CartTCPClient, error) { } func (m *CartTCPClient) SendPacket(messageType CartMessage, id CartId, data []byte) error { - + m.Conn.Write(header[:]) err := binary.Write(m.Conn, binary.LittleEndian, CartPacket{ Version: CurrentPacketVersion, MessageType: messageType, diff --git a/tcp-cart-mux-server.go b/tcp-cart-mux-server.go index 7a58f48..51433e2 100644 --- a/tcp-cart-mux-server.go +++ b/tcp-cart-mux-server.go @@ -70,7 +70,7 @@ func (m *TCPCartServerMux) handleFunction(connection net.Conn, messageType CartM m.mu.RUnlock() if ok { responseType, responseData, err := fn(id, data) - + connection.Write(header[:]) if err != nil { errData := []byte(err.Error()) err = binary.Write(connection, binary.LittleEndian, CartPacket{ @@ -96,6 +96,8 @@ func (m *TCPCartServerMux) handleFunction(connection net.Conn, messageType CartM packetsSent.Inc() _, err = connection.Write(responseData) return true, err + } else { + log.Printf("No cart handler for type: %d\n", messageType) } return false, nil } diff --git a/tcp-cart_test.go b/tcp-cart_test.go index 5794d0c..74a7433 100644 --- a/tcp-cart_test.go +++ b/tcp-cart_test.go @@ -23,23 +23,24 @@ func TestCartTcpHelpers(t *testing.T) { return nil }) 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") }) server.HandleCall(2, func(id CartId, data []byte) (CartMessage, []byte, error) { - log.Printf("Received call: %s\n", string(data)) - return 3, []byte("Hello, client!"), nil + log.Printf("Received 2 call: %s\n", string(data)) + return 4, []byte("Hello, client!"), nil }) // server.HandleCall(Ping, func(id CartId, data []byte) (CartMessage, []byte, error) { // return Pong, nil, nil // }) id := ToCartId("kalle") 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 { t.Errorf("Error calling: %v\n", err) } s, err := client.Call(666, id, 3, []byte("Hello, server!")) + client.Close() if err != nil { t.Errorf("Error calling: %v\n", err) } diff --git a/tcp-client.go b/tcp-client.go index 6dcf41b..5bb6d33 100644 --- a/tcp-client.go +++ b/tcp-client.go @@ -92,8 +92,14 @@ func NewTCPClient(address string) (*TCPClient, error) { }, 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{ Version: CurrentPacketVersion, MessageType: messageType, diff --git a/tcp-mux-server.go b/tcp-mux-server.go index fa43cfc..ff2f0d3 100644 --- a/tcp-mux-server.go +++ b/tcp-mux-server.go @@ -69,6 +69,7 @@ func (m *TCPServerMux) handleFunction(connection net.Conn, messageType PoolMessa function, ok := m.functions[messageType] m.mu.RUnlock() if ok { + connection.Write(header[:]) responseType, responseData, err := function(data) if err != nil { errData := []byte(err.Error()) @@ -93,6 +94,8 @@ func (m *TCPServerMux) handleFunction(connection net.Conn, messageType PoolMessa packetsSent.Inc() _, err = connection.Write(responseData) return true, err + } else { + log.Printf("No pool handler for type: %d\n", messageType) } return false, nil }