package socket import ( "fmt" "log" "net" "strings" "tunnel/pkg/server/env" ) type dialSocket struct { proto, addr string } func newDialSocket(proto, addr string) (S, error) { 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) { addr := e.Expand(s.addr) switch s.proto { case "tcp", "udp": if !strings.Contains(addr, ":") { addr = "localhost:" + addr } } conn, err := net.Dial(s.proto, addr) if err != nil { return nil, err } la, ra := conn.LocalAddr(), conn.RemoteAddr() desc := fmt.Sprintf("%s/%s->%s", la.Network(), la, ra) info := fmt.Sprintf(">%s/%s", ra.Network(), ra) log.Println("dial", desc) return newConn(conn, desc, info), nil } func (s *dialSocket) Close() { }