torrent

package
v0.0.0-...-d4acd20 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 19, 2025 License: Apache-2.0 Imports: 23 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type BitField

type BitField []byte

func (BitField) IsSet

func (bf BitField) IsSet(index int) bool

func (BitField) Set

func (bf BitField) Set(index int)

func (BitField) String

func (bf BitField) String() string

type Config

type Config struct {
	FetchPeersTimeout     time.Duration
	UpdateTrackersRate    time.Duration
	ReadMessageTimeout    time.Duration
	PeerConnectionTimeout time.Duration
	RetryPeersRate        time.Duration
}

type Downloader

type Downloader struct {
	Config  Config
	Torrent *Torrent
	Logger  *log.Logger

	ClientID [20]byte
	Port     int

	MetaDataSize       int
	MetaDataPieceSize  int
	MetaDataPieceCount int

	MetaDataSizeCh     chan int
	MetaDataSizeDoneCh chan struct{}

	MetaDataPieceCh      chan MetaDataPiece
	MetaDataPiecesDoneCh chan struct{}
	GotMetaData          atomic.Bool

	Files  []*os.File
	Ranges map[int][]fileRange

	PieceRequestsCh chan pieceRequest
	PieceResponseCh chan pieceResponce

	InFlightPeers map[string]bool
	FetchPeerCh   chan string
	RetryPeerCh   chan string

	Closed   chan struct{}
	Done     chan struct{}
	Progress chan float64
}

func NewDownloader

func NewDownloader(config Config, torrent *Torrent, logger *log.Logger) *Downloader

func (*Downloader) Close

func (d *Downloader) Close()

func (*Downloader) Start

func (d *Downloader) Start(downloadPath string) error

type ExtendedMessage

type ExtendedMessage struct {
	ID        MessageID
	Extension byte
	Payload   []byte
}

func (*ExtendedMessage) Serialize

func (e *ExtendedMessage) Serialize() []byte

type FileInfo

type FileInfo struct {
	Length int
	Path   string
}

type Handshake

type Handshake struct {
	Str      string
	InfoHash [20]byte
	ID       [20]byte
}

func (*Handshake) Serialize

func (h *Handshake) Serialize() []byte

type HaveMessage

type HaveMessage struct {
	PieceIndex int
}

type Message

type Message struct {
	ID      MessageID
	Payload []byte
}

func (*Message) Serialize

func (m *Message) Serialize() []byte

func (*Message) String

func (m *Message) String() string

type MessageID

type MessageID uint8
const (
	MessageChoke MessageID = iota
	MessageUnchoke
	MessageInterested
	MessageNotInterested
	MessageHave
	MessageBitfield
	MessageRequest
	MessagePiece
	MessageCancel
	MessageExtended = 20
)

type MetaData

type MetaData struct {
	Length      int
	Files       []FileInfo
	PieceLength int
	Pieces      [][20]byte
}

type MetaDataPiece

type MetaDataPiece struct {
	Index int
	Data  []byte
}

type Peer

type Peer struct {
	Addr string
	ID   [20]byte

	Choked bool
	// contains filtered or unexported fields
}

func (*Peer) DownloadPiece

func (p *Peer) DownloadPiece(conn net.Conn, readTimeout time.Duration, pieceIndex int, pieceLength int, pieceHash [20]byte, logger *log.Logger) ([]byte, error)

func (*Peer) HandleBitFieldMessage

func (p *Peer) HandleBitFieldMessage(msg *Message)

func (*Peer) HandleMessage

func (p *Peer) HandleMessage(msg *Message) error

func (Peer) HasPiece

func (p Peer) HasPiece(pieceIndex int) bool

func (*Peer) IsBitFieldValid

func (p *Peer) IsBitFieldValid(pieceCount int) error

func (Peer) SendInterestedMessage

func (p Peer) SendInterestedMessage(conn net.Conn) error

func (Peer) SendUnchokeMessage

func (p Peer) SendUnchokeMessage(conn net.Conn) error

func (*Peer) SetPiece

func (p *Peer) SetPiece(pieceIndex int)

func (*Peer) ShakeHands

func (p *Peer) ShakeHands(conn net.Conn, readTimeout time.Duration, infoHash [20]byte, ID [20]byte) error

func (Peer) String

func (p Peer) String() string

type PieceMessage

type PieceMessage struct {
	PieceIndex  int
	BlockOffset int
	BlockData   []byte
}

type Torrent

type Torrent struct {
	MetaData
	AnnounceUrls []string
	Name         string
	InfoHash     [20]byte
}

func ParseFile

func ParseFile(filename string) (*Torrent, error)

func ParseMagnet

func ParseMagnet(magnet string) (*Torrent, error)

func (Torrent) CalculatePieceLength

func (t Torrent) CalculatePieceLength(index int) int

type TorrentFileInfo

type TorrentFileInfo struct {
	Length int      `bencode:"length"`
	Path   []string `bencode:"path"`
}

type TorrentInfo

type TorrentInfo struct {
	Length      int               `bencode:"length,omitempty"`
	Name        string            `bencode:"name"`
	Files       []TorrentFileInfo `bencode:"files,omitempty"`
	PieceLength int               `bencode:"piece length"`
	Pieces      string            `bencode:"pieces"`
}

type TorrentMetaInfo

type TorrentMetaInfo struct {
	Announce     string      `bencode:"announce"`
	AnnounceList [][]string  `bencode:"announce-list"`
	Info         TorrentInfo `bencode:"info"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL
⌂ 换网址