aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-01-18 00:14:59 +0800
committerobscuren <geffobscura@gmail.com>2014-01-18 00:14:59 +0800
commit87434a09418e6cc2dd4b92d7e35afc6f155994bc (patch)
tree76914e772618c2d31050ef63fbc3ea589a6a30d1
parentddf82c333702e22d3cd7e5c693ad0603089a57a4 (diff)
downloadgo-tangerine-87434a09418e6cc2dd4b92d7e35afc6f155994bc.tar.gz
go-tangerine-87434a09418e6cc2dd4b92d7e35afc6f155994bc.tar.zst
go-tangerine-87434a09418e6cc2dd4b92d7e35afc6f155994bc.zip
Ping pong message
-rw-r--r--peer.go8
-rw-r--r--server.go4
2 files changed, 9 insertions, 3 deletions
diff --git a/peer.go b/peer.go
index d876205e2..76a810063 100644
--- a/peer.go
+++ b/peer.go
@@ -34,6 +34,9 @@ type Peer struct {
// This flag is used by writeMessage to check if messages are allowed
// to be send or not. If no version is known all messages are ignored.
versionKnown bool
+
+ // Last received pong message
+ lastPong int64
}
func NewPeer(conn net.Conn, server *Server, inbound bool) *Peer {
@@ -109,7 +112,7 @@ func (p *Peer) writeMessage(msg *ethwire.InOutMsg) {
// Outbound message handler. Outbound messages are handled here
func (p *Peer) HandleOutbound() {
// The ping timer. Makes sure that every 2 minutes a ping is send to the peer
- tickleTimer := time.NewTimer(2 * time.Minute)
+ tickleTimer := time.NewTicker(2 * time.Minute)
out:
for {
select {
@@ -173,7 +176,10 @@ out:
case ethwire.MsgGetPeersTy:
case ethwire.MsgPeersTy:
case ethwire.MsgPingTy:
+ // Respond back with pong
+ p.writeMessage(&ethwire.InOutMsg{Type: ethwire.MsgPongTy})
case ethwire.MsgPongTy:
+ p.lastPong = time.Now().Unix()
/*
case "blockmine":
diff --git a/server.go b/server.go
index f17cc32a0..9907f3b24 100644
--- a/server.go
+++ b/server.go
@@ -81,13 +81,13 @@ func (s *Server) Broadcast(msgType ethwire.MsgType, data []byte) {
}
const (
- processReapingTimeout = 10 // TODO increase
+ processReapingTimeout = 1 // TODO increase
)
func (s *Server) ReapDeadPeers() {
for {
eachPeer(s.peers, func(p *Peer, e *list.Element) {
- if atomic.LoadInt32(&p.disconnect) == 1 {
+ if atomic.LoadInt32(&p.disconnect) == 1 || (p.inbound && (time.Now().Unix()-p.lastPong) > int64(5*time.Minute)) {
log.Println("Dead peer found .. reaping")
s.peers.Remove(e)