Files
go-cart-actor/tcp-mux-client.go
matst80 10d85350d0
All checks were successful
Build and Publish / BuildAndDeploy (push) Successful in 1m49s
tcp mux and stuff
2024-11-10 16:40:52 +01:00

77 lines
1.4 KiB
Go

package main
import (
"encoding/binary"
"io"
"net"
"time"
)
type Client struct {
*TCPClientMux
}
func Dial(address string) (*Client, error) {
conn, err := net.Dial("tcp", address)
if err != nil {
return nil, err
}
client := &Client{
TCPClientMux: NewTCPClientMux(conn),
}
return client, nil
}
func (c *Client) Close() {
c.Conn.Close()
}
type TCPClientMux struct {
net.Conn
*PacketQueue
}
func NewTCPClientMux(connection net.Conn) *TCPClientMux {
return &TCPClientMux{
Conn: connection,
PacketQueue: NewPacketQueue(connection),
}
}
func (m *TCPClientMux) Close() {
m.Conn.Close()
}
func (m *TCPClientMux) SendPacket(messageType uint16, data []byte) error {
err := binary.Write(m.Conn, binary.LittleEndian, Packet{
Version: 1,
MessageType: messageType,
DataLength: uint16(len(data)),
})
if err != nil {
return err
}
_, err = m.Conn.Write(data)
return err
}
func (m *TCPClientMux) SendPacketFn(messageType uint16, datafn func(w io.Writer) error) error {
data, err := GetData(datafn)
if err != nil {
return err
}
return m.SendPacket(messageType, data)
}
func (m *TCPClientMux) Call(messageType uint16, responseType uint16, data []byte) ([]byte, error) {
err := m.SendPacket(messageType, data)
if err != nil {
return nil, err
}
packet, err := m.Expect(responseType, time.Second)
if err != nil {
return nil, err
}
return packet.Data, nil
}