Documentation
¶
Index ¶
- Constants
- func Write(w io.Writer, set ...encoding.BinaryMarshaler) (n int, err error)
- type CompactIp
- type Decoder
- type EncryptionHandshake
- type ExtendedHandshakeMessage
- type ExtensionBits
- func (pex ExtensionBits) GetBit(bit uint) bool
- func (pex *ExtensionBits) SetBit(bit uint)
- func (pex ExtensionBits) String() string
- func (pex ExtensionBits) Supported(rpex ExtensionBits, bits ...uint) bool
- func (pex ExtensionBits) SupportsDHT() bool
- func (pex ExtensionBits) SupportsExtended() bool
- func (pex ExtensionBits) SupportsFast() bool
- type ExtensionName
- type ExtensionNumber
- type Handshake
- type HandshakeInfoMessage
- type HandshakeMessage
- type Integer
- type Message
- func MakeCancelMessage(piece, offset, length Integer) Message
- func NewAllowedFast(piece uint32) Message
- func NewBitField(n uint64, b *roaring.Bitmap) Message
- func NewChoked() Message
- func NewDHTPort(p uint16) Message
- func NewExtended(id ExtensionNumber, encoded []byte) Message
- func NewExtendedHandshake(encoded []byte) Message
- func NewHaveAll() Message
- func NewHaveNone() Message
- func NewHavePiece(p uint64) Message
- func NewInterested(b bool) Message
- func NewKeepAlive() Message
- func NewPiece(index Integer, begin Integer, bin []byte) Message
- func NewPort(p uint16) Message
- func NewUnchoked() Message
- type MessageType
- type PexMsg
- type PexPeerFlags
- type RequestSpec
Constants ¶
const ( ExtensionBitDHT uint = 0 // http://www.bittorrent.org/beps/bep_0005.html ExtensionBitFast uint = 2 // http://www.bittorrent.org/beps/bep_0006.html ExtensionBitExtended uint = 20 // http://www.bittorrent.org/beps/bep_0010.html )
Extension bits for bittorrent protocol
const ( PexPrefersEncryption = 0x01 PexSeedUploadOnly = 0x02 PexSupportsUtp = 0x04 PexHolepunchSupport = 0x08 PexOutgoingConn = 0x10 )
Constants for PEX messages.
const ( HandshakeExtendedID = iota MetadataExtendedID PEXExtendedID ExtendedIdMax )
const ( RequestMetadataExtensionMsgType = 0 DataMetadataExtensionMsgType = 1 RejectMetadataExtensionMsgType = 2 )
const (
Protocol = "\x13BitTorrent protocol"
)
Variables ¶
This section is empty.
Functions ¶
Types ¶
type CompactIp ¶
Marshals to the smallest compact byte representation.
func (CompactIp) MarshalBencode ¶
type Decoder ¶
type EncryptionHandshake ¶
type EncryptionHandshake struct {
Keys mse.SecretKey
mse.CryptoSelector // available crypto algorithms
}
EncryptionHandshake encrypt a net.Conn
func (EncryptionHandshake) Incoming ¶
func (t EncryptionHandshake) Incoming(rw io.ReadWriter) (updated io.ReadWriter, buffed io.ReadWriter, err error)
Incoming establishes an encrypted connection. if it is unable to establish an encrypted connection. it returns a buffed read/writer that contains the previously read data from the input. when the encryption handshake is successful, buffed === updated.
func (EncryptionHandshake) Outgoing ¶
func (t EncryptionHandshake) Outgoing(rw io.ReadWriter, secret []byte, algo mse.CryptoMethod) (io.ReadWriter, mse.CryptoMethod, error)
Outgoing initiates an outgoing encrypted connection.
type ExtendedHandshakeMessage ¶
type ExtendedHandshakeMessage struct {
M map[ExtensionName]ExtensionNumber `bencode:"m"`
V string `bencode:"v,omitempty"`
Reqq int `bencode:"reqq,omitempty"`
Encryption bool `bencode:"e,omitempty"`
// BEP 9
MetadataSize int `bencode:"metadata_size,omitempty"`
// The local client port. It would be redundant for the receiving side of
// a connection to send this.
Port int `bencode:"p,omitempty"`
YourIp CompactIp `bencode:"yourip,omitempty"`
Ipv4 CompactIp `bencode:"ipv4,omitempty"`
Ipv6 net.IP `bencode:"ipv6,omitempty"`
}
type ExtensionBits ¶
type ExtensionBits [8]byte
ExtensionBits used by the Handshake to determine capabilities of a peer.
func NewExtensionBits ¶
func NewExtensionBits(bits ...uint) (ret ExtensionBits)
NewExtensionBits initiatize extension bits
func (ExtensionBits) String ¶
func (pex ExtensionBits) String() string
func (ExtensionBits) Supported ¶
func (pex ExtensionBits) Supported(rpex ExtensionBits, bits ...uint) bool
func (ExtensionBits) SupportsExtended ¶
func (pex ExtensionBits) SupportsExtended() bool
SupportsExtended ...
type ExtensionName ¶
type ExtensionName string
http://www.bittorrent.org/beps/bep_0010.html
const ( // http://www.bittorrent.org/beps/bep_0011.html ExtensionNamePex ExtensionName = "ut_pex" // http://bittorrent.org/beps/bep_0009.html. Note that there's an // LT_metadata, but I've never implemented it. ExtensionNameMetadata = "ut_metadata" )
type Handshake ¶
type Handshake struct {
Bits ExtensionBits
PeerID [20]byte
}
Handshake ...
func (Handshake) Incoming ¶
func (t Handshake) Incoming(sock io.ReadWriter) (pbits ExtensionBits, pinfo HandshakeInfoMessage, err error)
Incoming handshake, used to accept a connection from a peer.
func (Handshake) Outgoing ¶
func (t Handshake) Outgoing(sock io.ReadWriter, hash [20]byte) (resbits ExtensionBits, res HandshakeInfoMessage, err error)
Outgoing handshake, used to establish a connection to a peer.
type HandshakeInfoMessage ¶
HandshakeInfoMessage sent after the HandshakeMessage containing the peers ID and the info hash.
type HandshakeMessage ¶
type HandshakeMessage struct {
Extensions [8]byte
}
HandshakeMessage writes the handshake into a destination.
type Integer ¶
type Integer uint32
type Message ¶
type Message struct {
Keepalive bool
Type MessageType
Index, Begin, Length Integer
Piece []byte
Bitfield []bool
ExtendedID ExtensionNumber
ExtendedPayload []byte
Port uint16
}
This is a lazy union representing all the possible fields for messages. Go doesn't have ADTs, and I didn't choose to use type-assertions.
func MakeCancelMessage ¶
func NewAllowedFast ¶
func NewDHTPort ¶
func NewExtended ¶
func NewExtended(id ExtensionNumber, encoded []byte) Message
func NewExtendedHandshake ¶
func NewHaveAll ¶
func NewHaveAll() Message
func NewHaveNone ¶
func NewHaveNone() Message
func NewHavePiece ¶
func NewInterested ¶
func NewKeepAlive ¶
func NewKeepAlive() Message
func NewUnchoked ¶
func NewUnchoked() Message
func (Message) MarshalBinary ¶
func (Message) MustMarshalBinary ¶
func (Message) RequestSpec ¶
func (msg Message) RequestSpec() (ret RequestSpec)
type MessageType ¶
type MessageType byte
const ( // BEP 3 Choke MessageType = 0 Unchoke MessageType = 1 Interested MessageType = 2 NotInterested MessageType = 3 Have MessageType = 4 Bitfield MessageType = 5 Request MessageType = 6 Piece MessageType = 7 Cancel MessageType = 8 Port MessageType = 9 // BEP 6 - Fast extension Suggest MessageType = 0x0d // 13 HaveAll MessageType = 0x0e // 14 HaveNone MessageType = 0x0f // 15 Reject MessageType = 0x10 // 16 AllowedFast MessageType = 0x11 // 17 // BEP 10 Extended MessageType = 0x14 // 20 )
func (MessageType) FastExtension ¶
func (mt MessageType) FastExtension() bool
func (MessageType) String ¶
func (i MessageType) String() string
type PexMsg ¶
type PexMsg struct {
Added krpc.CompactIPv4NodeAddrs `bencode:"added"`
AddedFlags []PexPeerFlags `bencode:"added.f"`
Added6 krpc.CompactIPv6NodeAddrs `bencode:"added6"`
Added6Flags []PexPeerFlags `bencode:"added6.f"`
Dropped krpc.CompactIPv4NodeAddrs `bencode:"dropped"`
Dropped6 krpc.CompactIPv6NodeAddrs `bencode:"dropped6"`
}
type PexPeerFlags ¶
type PexPeerFlags byte
PexPeerFlags flags describing peers supported functionality.
func (PexPeerFlags) Get ¶
func (t PexPeerFlags) Get(f PexPeerFlags) bool
Get checks if the provided flags are set.
type RequestSpec ¶
type RequestSpec struct {
Index, Begin, Length Integer
}
func (RequestSpec) String ¶
func (me RequestSpec) String() string