require header match
This commit is contained in:
33
packet.go
33
packet.go
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user