forked from elastos/Elastos.ELA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ping.go
81 lines (72 loc) · 1.79 KB
/
ping.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package message
import (
"Elastos.ELA/common/config"
"Elastos.ELA/common/log"
"Elastos.ELA/common/serialization"
"Elastos.ELA/core/ledger"
. "Elastos.ELA/net/protocol"
"bytes"
"crypto/sha256"
"encoding/binary"
)
type ping struct {
messageHeader
height uint64
}
func NewPingMsg() ([]byte, error) {
var msg ping
msg.messageHeader.Magic = config.Parameters.Magic
copy(msg.messageHeader.CMD[0:7], "ping")
msg.height = uint64(ledger.DefaultLedger.Store.GetHeight())
tmpBuffer := bytes.NewBuffer([]byte{})
serialization.WriteUint64(tmpBuffer, msg.height)
b := new(bytes.Buffer)
err := binary.Write(b, binary.LittleEndian, tmpBuffer.Bytes())
if err != nil {
log.Error("Binary Write failed at new Msg")
return nil, err
}
s := sha256.Sum256(b.Bytes())
s2 := s[:]
s = sha256.Sum256(s2)
buf := bytes.NewBuffer(s[:4])
binary.Read(buf, binary.LittleEndian, &(msg.messageHeader.Checksum))
msg.messageHeader.Length = uint32(len(b.Bytes()))
m, err := msg.Serialization()
if err != nil {
log.Error("Error Convert net message ", err.Error())
return nil, err
}
return m, nil
}
func (msg ping) Handle(node Noder) error {
node.SetHeight(msg.height)
buf, err := NewPongMsg()
if err != nil {
log.Error("failed build a new ping message")
} else {
go node.Tx(buf)
}
return err
}
func (msg ping) Serialization() ([]byte, error) {
hdrBuf, err := msg.messageHeader.Serialization()
if err != nil {
return nil, err
}
buf := bytes.NewBuffer(hdrBuf)
err = serialization.WriteUint64(buf, msg.height)
if err != nil {
return nil, err
}
return buf.Bytes(), err
}
func (msg *ping) Deserialization(p []byte) error {
buf := bytes.NewBuffer(p)
err := binary.Read(buf, binary.LittleEndian, &(msg.messageHeader))
if err != nil {
return err
}
msg.height, err = serialization.ReadUint64(buf)
return err
}