以太坊系列之七: p2p模块的dial--以太坊源码学习
2024-08-25 14:11:09
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
最新文章
- 利用Swashbuckle生成Web API Help Pages
- tableview 位置发生偏移
- sqlserver中DATE类型的数据转化 CONVERT
- WinForm用户自定义控件,在主窗体加载时出现闪烁;调用用户控件出现闪烁,需要鼠标才能够显示
- (转)RHEL/CentOS 6.x使用EPEL6与remi的yum源安装MySQL 5.5.x
- 如何查看Linux操作系统版本
- python-布尔值
- Jquery filter()方法简介
- MPLS VPN随堂笔记3
- mysql中文、英文别名排序问题,order by 关键字详解
- BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs
- Step1:SQL Server 复制介绍
- CVE-2018-7566
- Java GC如何判断对象是否为垃圾
- Photoshop做32位带Alpha通道的bmp图片
- shell批量杀进程
- Linux学习笔记之初级篇
- oracle: sql语句报ora-01461/ora-00911错误
- 深入理解Java虚拟机,intern
- cxrichedit导入WORD
热门文章
- WARNING: cell0 mapping not found - not syncing cell0
- Java微信公众平台开发(十五)--微信JSSDK的使用
- ubuntu14.10下Qt5.4无法输入中文
- oracle:RETURNING 子句
- Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】
- 尝试在centos5下运行phantomjs2
- js 线程和进程的关系
- c++ deque 容器
- springMVC+spring+mybatis整合(包括文件上传和下载)
- oracle 通过序列实现某字段自增