package socket import ( "fmt" "net" "strings" "tunnel/pkg/server/env" ) func newListenSocket(proto, addr string) (S, error) { if proto == "tcp" { if !strings.Contains(addr, ":") { addr = ":" + addr } } listen, err := net.Listen(proto, addr) if err != nil { return nil, err } s := &listenSocket{ proto: proto, addr: addr, listen: listen, } return s, nil } func (s *listenSocket) Open(env.Env) (Conn, error) { conn, err := s.listen.Accept() 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 *listenSocket) String() string { return fmt.Sprintf("%s/%s,listen", s.proto, s.addr) } func (s *listenSocket) Close() { s.listen.Close() }