'da nasıl durdurabilirim Gitme bölümünde bir dinleme sunucusunu durdurmanın bir yolunu bulmaya çalışıyorum. listen.Accept
engellendiğinden, sonlandırmak için dinleme soketini kapatmak gerekir, ancak bu hatayı, ilgili hata verilmediğinden diğer hatalardan ayrı olarak anlatamam.Bir Dinleme sunucusunu Go
Bundan daha iyisini yapabilir miyim? 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()
}
aşağıda kodunda FIXME
gör Bu
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
Ben
Accept failed
mesajı gizlemek istiyorum
basar, ama açıkçası diğer hataları maskelemek istemiyoruz Accept
bildirebilirsiniz. Tabii ki use of closed network connection
için hata testine bakabilirim ama bu gerçekten çirkin olurdu. Bir bayrak ayarlayabilirim ki, sanırım ayarlanmışsa, hataları kapatmak ve göz ardı etmek üzereyim - Daha iyi bir yol var mı?
! Çalışmak zorunda olduğunuz gerçek bağlantıları olan bir yarış durumu var. –
Evet, doğru. Bunun tersini deneyebilirsiniz - her zaman başlangıçtan bu tek iç bağlantıya sahip ol ve bunu kontrol kanalı olarak kullan. –