में एक सुनवाई सर्वर को कैसे रोकूं मैं गो में एक सुनवाई सर्वर को रोकने के लिए एक रास्ता खोजने का प्रयास कर रहा हूं। क्योंकि 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 <- 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()
}
में यह
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
मैं Accept failed
संदेश छिपाना चाहते हैं, प्रिंट, लेकिन स्पष्ट रूप से मैं अन्य त्रुटियों से नकाब रिपोर्ट कर सकते हैं नहीं करना चाहती Accept
। मैं निश्चित रूप से use of closed network connection
के लिए त्रुटि परीक्षण में देख सकता हूं लेकिन यह वास्तव में बदसूरत होगा। मैं एक झंडा सेट कर सकता हूं कि मैं त्रुटियों को बंद करने और त्रुटियों को अनदेखा कर रहा हूं अगर यह निर्धारित किया गया था - क्या कोई बेहतर तरीका है?
एक स्वच्छ विचार है कि! वास्तविक कनेक्शन आने के साथ एक दौड़ की स्थिति है, हालांकि आपको आसपास काम करने की आवश्यकता होगी। –
हाँ, सच है। आप इसके विपरीत प्रयास कर सकते हैं - हमेशा से ही एक आंतरिक कनेक्शन शुरू करें और इसे एक नियंत्रण चैनल के रूप में उपयोग करें। –