-
Notifications
You must be signed in to change notification settings - Fork 1
/
peerMessageStruct.nim
55 lines (51 loc) · 943 Bytes
/
peerMessageStruct.nim
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
import binarylang
import binarylang/plugins
type
MsgType* = enum
mChoke = 0
mUnchoke = 1
mInterested = 2
mNotInterested = 3
mHave = 4
mBitfield = 5
mRequest = 6
mPiece = 7
mCancel = 8
mPort = 9
union(*payload, *MsgType, len:int):
(mChoke):
nil
(mUnchoke):
nil
(mInterested):
nil
(mNotInterested):
nil
(mHave):
32: *pieceIndex
(mBitfield):
s: *bitField(len)
(mRequest):
32: *indexR
32: *beginR
32: *lengthR
(mPiece):
32: *indexP
32: *beginP
s: *chunk(len-9)
(mCancel):
32: *indexC
32: *beginC
32: *lengthC
(mPort):
16: port
struct(*peerMessage, endian = b):
32: *len
8 {cond(len>0)}: *id
+payload(MsgType(id), len) {cond(len > 0 and id in (0..9))}: *payl(len-1)
struct(*peerPingMessage):
8: *pstrlen = 19
s: *pstr(pstrlen) = "BitTorrent protocol"
s: *protoExt(8)
s: *info_hash(20)
s: *peer_id(20)