12 Index, Begin, Length Integer
15 ExtendedID ExtensionNumber
16 ExtendedPayload []byte
20 func MakeCancelMessage(piece, offset, length Integer) Message {
29 func (msg Message) MustMarshalBinary() []byte {
30 b, err := msg.MarshalBinary()
37 func (msg Message) MarshalBinary() (data []byte, err error) {
38 buf := &bytes.Buffer{}
40 err = buf.WriteByte(byte(msg.Type))
45 case Choke, Unchoke, Interested, NotInterested, HaveAll, HaveNone:
47 err = binary.Write(buf, binary.BigEndian, msg.Index)
48 case Request, Cancel, Reject:
49 for _, i := range []Integer{msg.Index, msg.Begin, msg.Length} {
50 err = binary.Write(buf, binary.BigEndian, i)
56 _, err = buf.Write(marshalBitfield(msg.Bitfield))
58 for _, i := range []Integer{msg.Index, msg.Begin} {
59 err = binary.Write(buf, binary.BigEndian, i)
64 n, err := buf.Write(msg.Piece)
68 if n != len(msg.Piece) {
72 err = buf.WriteByte(byte(msg.ExtendedID))
76 _, err = buf.Write(msg.ExtendedPayload)
78 err = binary.Write(buf, binary.BigEndian, msg.Port)
80 err = fmt.Errorf("unknown message type: %v", msg.Type)
83 data = make([]byte, 4+buf.Len())
84 binary.BigEndian.PutUint32(data, uint32(buf.Len()))
85 if buf.Len() != copy(data[4:], buf.Bytes()) {
91 func marshalBitfield(bf []bool) (b []byte) {
92 b = make([]byte, (len(bf)+7)/8)
93 for i, have := range bf {