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

  • 相关阅读:
    2015抢票记事
    Provide your license server administrator with the following information.error code =-42,147
    微信支付现金红包接口
    SQL Server 触发器
    SQL增删查改注意的事项
    SQL while循环
    SQL SERVER 中is null 和 is not null 将会导致索引失效吗?
    HTML中head里的内容经浏览器解析后全到body里了
    sqLSERVER 计划缓存
    通用分页存储过程
  • 原文地址:https://www.cnblogs.com/baizx/p/6963645.html
Copyright © 2011-2022 走看看