diff --git a/server/client/generic.go b/server/client/generic.go new file mode 100644 index 0000000..84c7245 --- /dev/null +++ b/server/client/generic.go @@ -0,0 +1,21 @@ +package client + +import "net" + +func dial(network string, addr string, runState chan<- error, receive func(wst int, packet []byte), setConn func(conn net.Conn), isClosed func() bool) { + c, err := net.Dial(network, addr) + if err != nil { + runState <- err + return + } + setConn(c) + runState <- nil + packet := make([]byte, 1024) + for !isClosed() { + n, readErr := c.Read(packet) + if readErr != nil { + panic(readErr) + } + receive(0, packet[:n]) + } +} diff --git a/server/client/tcp.go b/server/client/tcp.go new file mode 100644 index 0000000..9c4198a --- /dev/null +++ b/server/client/tcp.go @@ -0,0 +1,36 @@ +package client + +import "net" + +func NewTCP(addr string) *Client { + return NewClient(&TCP{ + addr: addr, + }) +} + +type TCP struct { + conn net.Conn + addr string + closed bool +} + +func (slf *TCP) Run(runState chan<- error, receive func(wst int, packet []byte)) { + dial("tcp", slf.addr, runState, receive, func(conn net.Conn) { + slf.conn = conn + }, func() bool { + return slf.closed + }) +} + +func (slf *TCP) Write(packet *Packet) error { + _, err := slf.conn.Write(packet.data) + return err +} + +func (slf *TCP) Close() { + slf.closed = true +} + +func (slf *TCP) GetServerAddr() string { + return slf.addr +} diff --git a/server/client/uds.go b/server/client/uds.go index d2a0bcf..727fed9 100644 --- a/server/client/uds.go +++ b/server/client/uds.go @@ -17,21 +17,11 @@ type UnixDomainSocket struct { } func (slf *UnixDomainSocket) Run(runState chan<- error, receive func(wst int, packet []byte)) { - c, err := net.Dial("unix", slf.addr) - if err != nil { - runState <- err - return - } - slf.conn = c - runState <- nil - packet := make([]byte, 1024) - for !slf.closed { - n, readErr := slf.conn.Read(packet) - if readErr != nil { - panic(readErr) - } - receive(0, packet[:n]) - } + dial("unix", slf.addr, runState, receive, func(conn net.Conn) { + slf.conn = conn + }, func() bool { + return slf.closed + }) } func (slf *UnixDomainSocket) Write(packet *Packet) error {