Prechádzať zdrojové kódy

退出信号可以捕获

skyfffire 2 rokov pred
rodič
commit
bdb4bcd1e9
1 zmenil súbory, kde vykonal 17 pridanie a 3 odobranie
  1. 17 3
      p2p/server.go

+ 17 - 3
p2p/server.go

@@ -14,8 +14,11 @@ import (
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/p2p/netutil"
 	"net"
+	"os"
+	"os/signal"
 	"sort"
 	"sync"
+	"syscall"
 	"time"
 )
 
@@ -55,11 +58,15 @@ type Server struct {
 	//delpeer                 chan peerDrop
 	checkpointPostHandshake chan *conn
 	checkpointAddPeer       chan *conn
+	sigs                    chan os.Signal
 
 	//inboundHistory expHeap
 }
 
 func (server *Server) Start() (err error) {
+	server.sigs = make(chan os.Signal, 1)
+	signal.Notify(server.sigs, syscall.SIGINT, syscall.SIGTERM)
+
 	server.quit = make(chan struct{})
 	server.checkpointPostHandshake = make(chan *conn)
 	server.checkpointAddPeer = make(chan *conn)
@@ -93,18 +100,25 @@ func (server *Server) Start() (err error) {
 	server.setupDialScheduler()
 
 	// server核心运行
+	go server.StopListener()
 	server.run()
 
 	return nil
 }
 
+func (server *Server) StopListener() {
+	<-server.sigs
+
+	close(server.quit)
+	server.loopWG.Done()
+	server.discmix.Close()
+	server.dialsched.stop()
+}
+
 func (server *Server) run() {
 	server.loopWG.Add(1)
 
 	fmt.Printf("Started P2P networking, self: %v.\n", server.localnode.Node().URLv4())
-	defer server.loopWG.Done()
-	defer server.discmix.Close()
-	defer server.dialsched.stop()
 
 	//var (
 	//	peers        = make(map[enode.ID]*Peer)