summaryrefslogtreecommitdiff
path: root/pkg/client/client.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/client/client.go')
-rw-r--r--pkg/client/client.go57
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()
+}