Prechádzať zdrojové kódy

实现runPeer方法。

skyfffire 2 rokov pred
rodič
commit
90f2f235f0
3 zmenil súbory, kde vykonal 41 pridanie a 3 odobranie
  1. 13 0
      p2p/peer.go
  2. 7 0
      p2p/peer_drop.go
  3. 21 3
      p2p/server.go

+ 13 - 0
p2p/peer.go

@@ -4,6 +4,7 @@ import (
 	"blockchain-go/common/mclock"
 	"blockchain-go/p2p/enode"
 	"errors"
+	"net"
 	"sort"
 	"sync"
 	"time"
@@ -109,6 +110,18 @@ func (p *Peer) Inbound() bool {
 	return p.rw.is(inboundConn)
 }
 
+func (p *Peer) ID() enode.ID {
+	return p.rw.node.ID()
+}
+
+func (p *Peer) RemoteAddr() net.Addr {
+	return p.rw.fd.RemoteAddr()
+}
+
+func (p *Peer) LocalAddr() net.Addr {
+	return p.rw.fd.LocalAddr()
+}
+
 func (p *Peer) run() (remoteRequested bool, err error) {
 	var (
 		writeStart = make(chan struct{}, 1)

+ 7 - 0
p2p/peer_drop.go

@@ -0,0 +1,7 @@
+package p2p
+
+type peerDrop struct {
+	*Peer
+	err       error
+	requested bool // true if signaled by the peer
+}

+ 21 - 3
p2p/server.go

@@ -2,6 +2,7 @@ package p2p
 
 import (
 	"blockchain-go/common/gopool"
+	"blockchain-go/event"
 	"blockchain-go/p2p/discover"
 	"blockchain-go/p2p/enode"
 	"blockchain-go/p2p/enr"
@@ -40,7 +41,7 @@ type Server struct {
 	listener     net.Listener
 	ourHandshake *protoHandshake
 	loopWG       sync.WaitGroup // loop, listenLoop
-	//peerFeed event.Feed
+	peerFeed     event.Feed
 	//log log.Logger
 
 	//nodedb    *enode.DB
@@ -55,7 +56,7 @@ type Server struct {
 	//removetrusted chan *enode.Node
 	//peerOp                  chan peerOpFunc
 	//peerOpDone              chan struct{}
-	//delpeer                 chan peerDrop
+	delpeer                 chan peerDrop
 	checkpointPostHandshake chan *conn
 	checkpointAddPeer       chan *conn
 	sigs                    chan os.Signal
@@ -169,7 +170,24 @@ func (server *Server) launchPeer(c *conn) *Peer {
 }
 
 func (server *Server) runPeer(p *Peer) {
-	// TODO 实现peer的细节
+	server.peerFeed.Send(&PeerEvent{
+		Type:          PeerEventTypeAdd,
+		Peer:          p.ID(),
+		RemoteAddress: p.RemoteAddr().String(),
+		LocalAddress:  p.LocalAddr().String(),
+	})
+
+	remoteRequested, err := p.run()
+
+	server.delpeer <- peerDrop{p, err, remoteRequested}
+
+	server.peerFeed.Send(&PeerEvent{
+		Type:          PeerEventTypeDrop,
+		Peer:          p.ID(),
+		Error:         err.Error(),
+		RemoteAddress: p.RemoteAddr().String(),
+		LocalAddress:  p.LocalAddr().String(),
+	})
 }
 
 func (server *Server) StopListener() {