Как остановить сервер прослушивания в Go
Я пытался найти способ остановить слушающий сервер в Go изящно. Так какlisten.Accept
блоки, необходимо закрыть сокет прослушивания, чтобы сигнализировать об окончании, но я могуне сообщать об этой ошибке отдельно от других ошибок, поскольку соответствующая ошибка нет экспортировано.
Могу ли я сделать лучше, чем это? УвидетьFIXME
в коде ниже вserve()
package main
import (
"io"
"log"
"net"
"time"
)
// Echo server struct
type EchoServer struct {
listen net.Listener
done chan bool
}
// Respond to incoming connection
//
// Write the address connected to then echo
func (es *EchoServer) respond(remote *net.TCPConn) {
defer remote.Close()
_, err := io.Copy(remote, remote)
if err != nil {
log.Printf("Error: %s", err)
}
}
// Listen for incoming connections
func (es *EchoServer) serve() {
for {
conn, err := es.listen.Accept()
// FIXME I'd like to detect "use of closed network connection" here
// FIXME but it isn't exported from net
if err != nil {
log.Printf("Accept failed: %v", err)
break
}
go es.respond(conn.(*net.TCPConn))
}
es.done