1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2025-01-02 23:47:07 -05:00

Simplify Design

This commit is contained in:
Shelikhoo 2016-08-15 21:36:37 +08:00
parent 45d801b922
commit 32e8deb6e8
No known key found for this signature in database
GPG Key ID: 7791BDB0709ABD21

View File

@ -6,54 +6,24 @@ import (
)
type StoppableListener struct {
net.Listener //Wrapped listener
stop chan int //Channel used only to indicate listener should shutdown
net.Listener //Wrapped listener
}
func NewStoppableListener(l net.Listener) (*StoppableListener, error) {
/*
tcpL, ok := l.(*net.TCPListener)
if !ok {
return nil, errors.New("Cannot wrap listener")
}
*/
retval := &StoppableListener{}
retval.Listener = l
retval.stop = make(chan int)
return retval, nil
}
var StoppedError = errors.New("Listener stopped")
func (sl *StoppableListener) Accept() (net.Conn, error) {
newConn, err := sl.Listener.Accept()
return newConn, err
for {
newConn, err := sl.Listener.Accept()
//Check for the channel being closed
select {
case <-sl.stop:
return nil, StoppedError
default:
//If the channel is still open, continue as normal
}
if err != nil {
netErr, ok := err.(net.Error)
//If this is a timeout, then continue to wait for
//new connections
if ok && netErr.Timeout() && netErr.Temporary() {
continue
}
}
return newConn, err
}
}
func (sl *StoppableListener) Stop() {
close(sl.stop)
sl.Listener.Close()
}