package socket import ( "fmt" "log" "net" "time" "tunnel/pkg/server/env" ) const defaultTimeout = 5 * time.Second type dialSocket struct { Proto string `opts:"default:tcp"` Addr string `opts:"required"` } func (s *dialSocket) String() string { return fmt.Sprintf("%s/%s", s.Proto, s.Addr) } func (s *dialSocket) New(e env.Env) (Conn, error) { proto, addr := parseProtoAddr(s.Proto, e.Expand(s.Addr)) conn, err := net.DialTimeout(proto, addr, defaultTimeout) 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() { } func init() { register("dial", "connect to the network address", dialSocket{}) }