Documentation
¶
Overview ¶
Package krpc supplies the KRPC message used by DHT.
Index ¶
Constants ¶
const ( // BEP 5 ErrorCodeGeneric = 201 ErrorCodeServer = 202 ErrorCodeProtocol = 203 ErrorCodeMethodUnknown = 204 // BEP 44 ErrorCodeMessageValueFieldTooBig = 205 ErrorCodeInvalidSignature = 206 ErrorCodeSaltFieldTooBig = 207 ErrorCodeCasHashMismatched = 301 ErrorCodeSequenceNumberLessThanCurrent = 302 )
Predefine some error code.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CompactAddresses ¶
CompactAddresses represents a group of the compact addresses.
func (CompactAddresses) MarshalBinary ¶
func (cas CompactAddresses) MarshalBinary() ([]byte, error)
MarshalBinary implements the interface binary.BinaryMarshaler.
func (*CompactAddresses) UnmarshalBinary ¶
func (cas *CompactAddresses) UnmarshalBinary(b []byte) (err error)
UnmarshalBinary implements the interface binary.BinaryUnmarshaler.
type CompactIPv4Node ¶
type CompactIPv4Node []Node
CompactIPv4Node is a set of IPv4 Nodes.
func (CompactIPv4Node) MarshalBencode ¶
func (cn CompactIPv4Node) MarshalBencode() (b []byte, err error)
MarshalBencode implements the interface bencode.Marshaler.
func (CompactIPv4Node) MarshalBinary ¶
func (cn CompactIPv4Node) MarshalBinary() ([]byte, error)
MarshalBinary implements the interface binary.BinaryMarshaler.
func (*CompactIPv4Node) UnmarshalBencode ¶
func (cn *CompactIPv4Node) UnmarshalBencode(b []byte) (err error)
UnmarshalBencode implements the interface bencode.Unmarshaler.
func (*CompactIPv4Node) UnmarshalBinary ¶
func (cn *CompactIPv4Node) UnmarshalBinary(b []byte) (err error)
UnmarshalBinary implements the interface binary.BinaryUnmarshaler.
type CompactIPv6Node ¶
type CompactIPv6Node []Node
CompactIPv6Node is a set of IPv6 Nodes.
func (CompactIPv6Node) MarshalBencode ¶
func (cn CompactIPv6Node) MarshalBencode() (b []byte, err error)
MarshalBencode implements the interface bencode.Marshaler.
func (CompactIPv6Node) MarshalBinary ¶
func (cn CompactIPv6Node) MarshalBinary() ([]byte, error)
MarshalBinary implements the interface binary.BinaryMarshaler.
func (*CompactIPv6Node) UnmarshalBencode ¶
func (cn *CompactIPv6Node) UnmarshalBencode(b []byte) (err error)
UnmarshalBencode implements the interface bencode.Unmarshaler.
func (*CompactIPv6Node) UnmarshalBinary ¶
func (cn *CompactIPv6Node) UnmarshalBinary(b []byte) (err error)
UnmarshalBinary implements the interface binary.BinaryUnmarshaler.
type Error ¶
Error represents a response error.
func (Error) MarshalBencode ¶
MarshalBencode implements the interface bencode.Marshaler.
func (*Error) UnmarshalBencode ¶
UnmarshalBencode implements the interface bencode.Unmarshaler.
type Message ¶
type Message struct { // Transaction ID // // Required T string `bencode:"t"` // BEP 5 // Message Type: "q" for QUERY, "r" for RESPONSE, "e" for ERROR // // Required Y string `bencode:"y"` // BEP 5 // Query Method: one of "ping", "find_node", "get_peers", "announce_peer" // // Required only if "y" is equal to "q". Q string `bencode:"q,omitempty"` // BEP 5 A QueryArg `bencode:"a,omitempty"` // BEP 5: Only for the QUERY message R ResponseResult `bencode:"r,omitempty"` // BEP 5: Only for the RESPONSE message E Error `bencode:"e,omitempty"` // BEP 5: Only for the ERROR message RO bool `bencode:"ro,omitempty"` // BEP 43: ReadOnly }
Message represents messages that nodes in the network send to each other as specified by the KRPC protocol, which are also referred to as the KRPC messages.
The message is a dictonary that is "bencoded" (serialization & compression format adopted by the BitTorrent) and sent via the UDP connection to peers.
There are three types of messages: QUERY, RESPONSE, ERROR.
A KRPC message is a single dictionary with two keys common to every message and additional keys depending on the type of message. Every message has a key "t" with a string value representing a transaction ID. This transaction ID is generated by the querying node and is echoed in the response, so responses may be correlated with multiple queries to the same node. The transaction ID should be encoded as a short string of binary numbers, typically 2 characters are enough as they cover 2^16 outstanding queries. The other key contained in every KRPC message is "y" with a single character value describing the type of message. The value of the "y" key is one of "q" for query, "r" for response, or "e" for error.
func NewErrorMsg ¶
NewErrorMsg return a ERROR message.
func NewQueryMsg ¶
NewQueryMsg return a QUERY message.
func NewResponseMsg ¶
func NewResponseMsg(tid string, data ResponseResult) Message
NewResponseMsg return a RESPONSE message.
func (Message) ID ¶
ID returns the QID or RID.
Notice: it will panic if the the message is not a query or response.
func (Message) IsResponse ¶
IsResponse reports whether the message is a RESPONSE message.
type Node ¶
Node represents a node information.
func NewNodeByUDPAddr ¶
NewNodeByUDPAddr returns a new Node with the id and the UDP address.
func (Node) MarshalBinary ¶
MarshalBinary implements the interface binary.BinaryMarshaler.
func (*Node) UnmarshalBinary ¶
UnmarshalBinary implements the interface binary.BinaryUnmarshaler.
type QueryArg ¶
type QueryArg struct { // ID is used to identify a querying node. ID metainfo.Hash `bencode:"id"` // BEP 5 // Target is used to identify the node sought by the queryer. // // find_node Target metainfo.Hash `bencode:"target,omitempty"` // BEP 5 // InfoHash is the infohash of the torrent file. // // get_peers, announce_peer InfoHash metainfo.Hash `bencode:"info_hash,omitempty"` // BEP 5 // Port is the port on where sender is listening to allow others // to download the torrent. // // announce_peer Port uint16 `bencode:"port,omitempty"` // BEP 5 // Token is the received one from an earlier "get_peers" query. // // announce_peer Token string `bencode:"token,omitempty"` // BEP 5 // ImpliedPort is used by the senders to apparent DHT port // to improve NAT support. // // announce_peer ImpliedPort bool `bencode:"implied_port,omitempty"` // BEP 5 // Wants is only used to represent to expect "nodes" for "n4" // or "nodes6" for "n6". // // Notice: It only governs the presence of the "nodes" and "nodes6" // parameters, not the interpretation of "values". // // find_node, get_peers Wants []Want `bencode:"want,omitempty"` // BEP 32 }
QueryArg represents the arguments used by the QUERY message.
func (QueryArg) ContainsWant ¶
ContainsWant reports whether the request contains the given Want.
type ResponseResult ¶
type ResponseResult struct { // ID is used to indentify the queried node, that's, the response node. ID metainfo.Hash `bencode:"id"` // BEP 5 // Nodes is a string containing the compact node information for the list // of the ipv4 target node, or the K(8) closest good nodes in routing table // of the requested ipv4 target. // // find_node Nodes CompactIPv4Node `bencode:"nodes,omitempty"` // BEP 5 // Nodes6 is a string containing the compact node information for the list // of the ipv6 target node, or the K(8) closest good nodes in routing table // of the requested ipv6 target. // // find_node Nodes6 CompactIPv6Node `bencode:"nodes6,omitempty"` // BEP 32 // Token is used for future "announce_peer". // // get_peers Token string `bencode:"token,omitempty"` // BEP 5 // Values is a list of the torrent peers. // // get_peers Values CompactAddresses `bencode:"values,omitempty"` // BEP 5 }
ResponseResult represents the results used by the RESPONSE message.