Go에서 듣기 서버를 정상적으로 중지하는 방법을 찾으려고했습니다. listen.Accept
블록 때문에 신호를 수신 대기 소켓을 닫을 필요가 있지만 관련 오류가 내 보내지 않았으므로 다른 오류와 떨어져 그 오류를 말할 수 없습니다.Go에서 듣기 서버를 중지하는 방법
내가 이보다 나아질 수 있습니까? 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()
}
에 아래의 코드에서 FIXME
를 참조하십시오이
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
에 대한 오류 테스트를 볼 수 있지만 정말 못생긴 것입니다. 플래그를 설정하여 닫고 오류를 무시한다면 설정 한 것입니다. 더 좋은 방법이 있습니까?
! 진짜 연결이 들어오는 경쟁 조건이 있습니다.하지만 당신은이 문제를 해결해야합니다. –
네, 맞습니다. 당신은 그것의 역행을 시도 할 수 있습니다. 항상 처음부터 그 단일 내부 연결을 가지고 그것을 제어 채널로 사용하십시오. –