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(config.IoTimeout)); 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() }