|
|
@@ -54,8 +54,8 @@ type Server struct {
|
|
|
//peerOp chan peerOpFunc
|
|
|
//peerOpDone chan struct{}
|
|
|
//delpeer chan peerDrop
|
|
|
- //checkpointPostHandshake chan *conn
|
|
|
- //checkpointAddPeer chan *conn
|
|
|
+ checkpointPostHandshake chan *conn
|
|
|
+ checkpointAddPeer chan *conn
|
|
|
|
|
|
// State of run loop and listenLoop.
|
|
|
//inboundHistory expHeap
|
|
|
@@ -63,6 +63,8 @@ type Server struct {
|
|
|
|
|
|
func (server *Server) Start() (err error) {
|
|
|
server.quit = make(chan struct{})
|
|
|
+ server.checkpointPostHandshake = make(chan *conn)
|
|
|
+ server.checkpointAddPeer = make(chan *conn)
|
|
|
|
|
|
if err := server.setupLocalNode(); err != nil {
|
|
|
return err
|
|
|
@@ -214,15 +216,46 @@ func (server *Server) SetupConn(fd net.Conn, flags connFlag, dialDest *enode.Nod
|
|
|
}
|
|
|
|
|
|
func (server *Server) setupConn(c *conn, dialDest *enode.Node) error {
|
|
|
- //
|
|
|
- //remotePubkey, err := c.doEncHandshake(server.PrivateKey)
|
|
|
- //if err != nil {
|
|
|
- // return err
|
|
|
- //}
|
|
|
+ remotePubkey, err := c.doEncHandshake(server.PrivateKey)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 将connection转换成node
|
|
|
+ c.node = enode.NodeFromConn(remotePubkey, c.fd)
|
|
|
+ fmt.Printf("id: %v, addr: %v, conn: %v", c.node.ID(), c.fd.RemoteAddr(), c.flags)
|
|
|
+
|
|
|
+ // 检查是否需要握手
|
|
|
+ err = server.checkpoint(c, server.checkpointPostHandshake)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ // 进行握手
|
|
|
+ phs, err := c.doProtoHandshake(server.ourHandshake)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ c.caps, c.name = phs.Caps, phs.Name
|
|
|
+
|
|
|
+ // 将此链接放入addPeer的检查点
|
|
|
+ err = server.checkpoint(c, server.checkpointAddPeer)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
+func (server *Server) checkpoint(c *conn, stage chan<- *conn) error {
|
|
|
+ select {
|
|
|
+ case stage <- c:
|
|
|
+ case <-server.quit:
|
|
|
+ return ErrServerStopped
|
|
|
+ }
|
|
|
+ return <-c.cont
|
|
|
+}
|
|
|
+
|
|
|
// 配置节点发现逻辑
|
|
|
func (server *Server) setupDiscovery() (err error) {
|
|
|
return nil
|