diff options
Diffstat (limited to 'pkg/client')
| -rw-r--r-- | pkg/client/client.go | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/pkg/client/client.go b/pkg/client/client.go new file mode 100644 index 0000000..d94b5a3 --- /dev/null +++ b/pkg/client/client.go @@ -0,0 +1,57 @@ +package client + +import ( + "tunnel/pkg/config" + "strings" + "errors" + "time" + "net" + "io" +) + +var errClosed = errors.New("server closed connection") + +type Client struct { + conn net.Conn +} + +func New() (*Client, error) { + conn, err := net.Dial(config.SockType, config.SockPath) + if err != nil { + return nil, err + } + + return &Client{conn: conn}, nil +} + +func (c *Client) Send(args []string) (string, error) { + c.conn.SetDeadline(time.Now().Add(time.Second)); + + defer func () { + var t time.Time + c.conn.SetDeadline(t) + }() + + msg := strings.Join(args, " ") + buf := make([]byte, config.BufSize) + + _, ew := c.conn.Write([]byte(msg)) + if ew != nil { + return "", ew + } + + nr, er := c.conn.Read(buf) + if er != nil { + if er == io.EOF { + return "", errClosed + } + + return "", er + } + + return string(buf[:nr]), nil +} + +func (c *Client) Close() { + c.conn.Close() +} |
