github.com/anacrolix/torrent@v1.61.0/tracker/udp/protocol.go (about)

     1  package udp
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"io"
     7  )
     8  
     9  type Action int32
    10  
    11  const (
    12  	ActionConnect Action = iota
    13  	ActionAnnounce
    14  	ActionScrape
    15  	ActionError
    16  )
    17  
    18  const ConnectRequestConnectionId = 0x41727101980
    19  
    20  const (
    21  	// BEP 41
    22  	optionTypeEndOfOptions = 0
    23  	optionTypeNOP          = 1
    24  	optionTypeURLData      = 2
    25  )
    26  
    27  type TransactionId = int32
    28  
    29  type ConnectionId = uint64
    30  
    31  type ConnectionRequest struct {
    32  	ConnectionId  ConnectionId
    33  	Action        Action
    34  	TransactionId TransactionId
    35  }
    36  
    37  type ConnectionResponse struct {
    38  	ConnectionId ConnectionId
    39  }
    40  
    41  type ResponseHeader struct {
    42  	Action        Action
    43  	TransactionId TransactionId
    44  }
    45  
    46  type RequestHeader struct {
    47  	ConnectionId  ConnectionId
    48  	Action        Action
    49  	TransactionId TransactionId
    50  } // 16 bytes
    51  
    52  type AnnounceResponseHeader struct {
    53  	Interval int32
    54  	Leechers int32
    55  	Seeders  int32
    56  }
    57  
    58  type InfoHash = [20]byte
    59  
    60  func marshal(data interface{}) (b []byte, err error) {
    61  	var buf bytes.Buffer
    62  	err = Write(&buf, data)
    63  	b = buf.Bytes()
    64  	return
    65  }
    66  
    67  func mustMarshal(data interface{}) []byte {
    68  	b, err := marshal(data)
    69  	if err != nil {
    70  		panic(err)
    71  	}
    72  	return b
    73  }
    74  
    75  // This is for fixed-size, builtin types only I think.
    76  func Write(w io.Writer, data interface{}) error {
    77  	return binary.Write(w, binary.BigEndian, data)
    78  }
    79  
    80  func Read(r io.Reader, data interface{}) error {
    81  	return binary.Read(r, binary.BigEndian, data)
    82  }