zoukankan      html  css  js  c++  java
  • 以太坊系列之七: p2p模块的dial--以太坊源码学习

    dial.go阅读手记

    dial.go是负责和peer建立连接关系的地方,主要是实现

    type dialer interface {
    /*
        peers已经有的结点
     */
    	newTasks(running int, peers map[discover.NodeID]*Peer, now time.Time) []task
    	taskDone(task, time.Time)
    	addStatic(*discover.Node)
    	removeStatic(*discover.Node)
    }
    // dialstate schedules dials and discovery lookups.
    // it get's a chance to compute new tasks on every iteration
    // of the main loop in Server.run.
    type dialstate struct {
    	maxDynDials int
    	ntab        discoverTable
    	netrestrict *netutil.Netlist
    
    	lookupRunning bool
    	dialing       map[discover.NodeID]connFlag  //正在创建的连接
    	lookupBuf     []*discover.Node // current discovery lookup results
    	randomNodes   []*discover.Node // filled from Table
    	static        map[discover.NodeID]*dialTask
    	hist          *dialHistory
    
    	start     time.Time        // time when the dialer was first used
    	bootnodes []*discover.Node // default dials when there are no peers
    }
    

    其中最复杂的是newTasks,是建立新的连接,从test代码中可以看出,
    要在指定的最大连接数(peers)基之上去创建新的连接

    lookupBuf // current discovery lookup results
    主要是在结束taskdone的时候添加已经发现的?

    在不超过maxDynDials的情况下,首先减去peers已有的连接,然后是static中的任务,
    如果过还有富余,富余空间中最多一半(根据实现,可能为0)用ReadRandomNodes填充,剩下的
    就用lookupBuf来填充,如果lookbuf中没有有效的任务,那么就创建一个discoverTask,
    如果还有空间,就创建一个waitExpireTask

    总之newTasks就是在尽可能的情况下,多创建任务.为Server.run scheduleTasks时服务,
    保证其能够连接到尽可能多的节点.如果节点数量不够的情况下,还没有dialTask就创建discoverTask,否则就创建一个WaitExpireTask

  • 相关阅读:
    关于java集合框架(二):List
    仪式感
    java的foreach(增强for循环)
    关于Java集合框架(一):概述与Set
    重新开始
    简单fork循环分析
    fork,写时复制(copy-on-write),vfork
    树莓派换源
    Windows下TexLive2018环境配置及检测
    Linux下高精度时间
  • 原文地址:https://www.cnblogs.com/baizx/p/6963645.html
Copyright © 2011-2022 走看看