package socket import ( "fmt" "net" "strings" "tunnel/pkg/server/env" ) type dialSocket struct { proto, addr string } func newDialSocket(proto, addr string) (S, error) { switch proto { case "tcp", "udp": if !strings.Contains(addr, ":") { addr = "localhost:" + addr } } return &dialSocket{proto: proto, addr: addr}, nil } func (s *dialSocket) String() string { return fmt.Sprintf("%s/%s", s.proto, s.addr) } func (s *dialSocket) Open(e env.Env) (Conn, error) { conn, err := net.Dial(s.proto, e.Eval(s.addr)) if err != nil { return nil, err } addr := conn.RemoteAddr() info := fmt.Sprintf(">%s/%s", addr.Network(), addr) return exported{info, newConn(conn)}, nil } func (s *dialSocket) Close() { }