以太坊源码分析---go-ethereum之p2p通信分析(2)

版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。golang群:570992072。qq 29185807 个人公众号:月牙寂道长 公众号微信号yueyajidaozhang https://blog.csdn.net/screscent/article/details/79416318
本文QQ空间链接: http://user.qzone.qq.com/29185807/blog/1519899372

本文csdn博客链接:http://blog.csdn.net/screscent/article/details/79416318


上一篇分析了p2p模块的初始化与start
 
继续上一篇分析。

 

先回顾下p2p的初始化

github.com/ethereum/go-ethereum/eth/backend.go

函数

func New(config *Config) (*Ethereumerror) {

 


下面是start


 

那现在进入到p2p模块中

github.com/ethereum/go-ethereum/p2p/server.go


p2p模块中,大部分的数据是通过chan来进行传输的。以上有7chan

 


上面是关键地方,两个入口。

下面分别介绍

 

Listen部分


继续跟踪


 

这里面有slots,是用来做数量限制的。用了一个带缓冲区的chan,先讲token放进去,然后先取出token,接收一个链接,当链接ok了后,将token放回去。

很简单的chan的应用

那么逻辑还是很清晰的,我们继续跟踪



 

这里面的东西就比较多了。一个一个来

先看下两个函数的原型doEncHandshakedoProtoHandshake


586 行, := & conn { fd fd transport srv . newTransport ( fd ) flags flags cont make ( chan  error )}

 

我们看下srv


然后我们回到 func  ( srv  * Server Start () ( err  error ) {

 


 

那么就知道了

github.com/ethereum/go-ethereum/p2p/rlpx.go


 

真正的处理函数在这里

github.com/ethereum/go-ethereum/p2p/rlpx.go


 

github.com/ethereum/go-ethereum/p2p/rlpx.go


 

好的回到 func  ( srv  * Server setupConn ( fd  net . Conn flags  connFlag dialDest  * discover . Node ) {

github.com/ethereum/go-ethereum/p2p/server.go

我们看下


在函数 func  ( srv  * Server setupConn ( fd  net . Conn flags  connFlag dialDest  * discover . Node ) {

 

 

if  err  :=  srv . checkpoint ( c srv . posthandshake ) err  !=  nil  {

 

if  err  :=  srv . checkpoint ( c srv . addpeer ) err  !=  nil  {

 

分别传递的是两个 chan srv . posthandshak srv . addpee    

 

好的,到这里listen的处理就完了。下面我们看如何通过chanrun进行配合工作的。

 

github.com/ethereum/go-ethereum/p2p/server.go




上面的重点到了,通过chan的传送,把数据传到run中,处理


上面才是重点。Addpeer

github.com/ethereum/go-ethereum/p2p/peer.go


传入的参数,protocolsrv.Protocols。这个我们在第一篇文章中有说到。

 

继续跟踪

github.com/ethereum/go-ethereum/p2p/server.go


 

继续

github.com/ethereum/go-ethereum/p2p/peer.go


 

重点三个地方,慢慢来看


很简单的读信息,然后进行处理

继续


上面的重点处理都在default中,这个就是最上层的入口

好的重点来了。跟踪进去,完了,好像看不懂


 

重点是在p.running

我们回过头去看看


我们知道初始化peer的时候,传送的是srv.Protocols。这个在第一篇文章有介绍了,

 

 

回到



这个很简单,定时的pingpong


 

我们看看最初的run在哪里

github.com/ethereum/go-ethereum/eth/handler.go

ProtocolManager初始化Protocols的时候


 

 

 

龚浩华

月牙寂 道长

QQ 29185807

20180301


猜你喜欢

转载自blog.csdn.net/screscent/article/details/79416318