Tôi đã cố gắng tìm cách dừng máy chủ nghe trong Go một cách duyên dáng. Vì khối listen.Accept
cần phải đóng ổ cắm nghe để báo hiệu kết thúc, nhưng tôi không thể nói lỗi đó ngoài bất kỳ lỗi nào khác vì lỗi liên quan không được xuất.Làm cách nào để dừng máy chủ Nghe trong Go
Tôi có thể làm tốt hơn điều này không? Xem FIXME
trong các mã dưới đây trong 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 <- true
}
// Stop the server by closing the listening listen
func (es *EchoServer) stop() {
es.listen.Close()
<-es.done
}
// Make a new echo server
func NewEchoServer(address string) *EchoServer {
listen, err := net.Listen("tcp", address)
if err != nil {
log.Fatalf("Failed to open listening socket: %s", err)
}
es := &EchoServer{
listen: listen,
done: make(chan bool),
}
go es.serve()
return es
}
// Main
func main() {
log.Println("Starting echo server")
es := NewEchoServer("127.0.0.1:18081")
// Run the server for 1 second
time.Sleep(1 * time.Second)
// Close the server
log.Println("Stopping echo server")
es.stop()
}
này in
2012/11/16 12:53:35 Starting echo server
2012/11/16 12:53:36 Stopping echo server
2012/11/16 12:53:36 Accept failed: accept tcp 127.0.0.1:18081: use of closed network connection
Tôi muốn giấu thông điệp Accept failed
, nhưng rõ ràng là tôi không muốn che giấu lỗi khác Accept
có thể báo cáo. Tôi có thể tất nhiên nhìn vào kiểm tra lỗi cho use of closed network connection
nhưng điều đó sẽ thực sự xấu xí. Tôi có thể thiết lập một lá cờ nói rằng tôi sắp đóng và bỏ qua lỗi nếu điều đó được đặt Tôi giả sử - Có cách nào tốt hơn không?
Đó là một ý tưởng gọn gàng! Có một điều kiện chủng tộc với các kết nối thực sự đến mặc dù bạn cần phải làm việc xung quanh. –
Vâng, đúng vậy. Bạn có thể thử một nghịch đảo của điều đó - luôn luôn có kết nối nội bộ duy nhất từ đầu và sử dụng nó như một kênh điều khiển. –