c.Interested = interested
}
-var (
- // Four consecutive zero bytes that comprise a keep alive on the wire.
- keepAliveBytes [4]byte
-)
-
// Writes buffers to the socket from the write channel.
func (conn *connection) writer() {
// Reduce write syscalls.
package dht
import (
- "bitbucket.org/anacrolix/go.torrent/iplist"
- "bitbucket.org/anacrolix/go.torrent/logonce"
- "bitbucket.org/anacrolix/go.torrent/util"
- "bitbucket.org/anacrolix/sync"
"crypto"
_ "crypto/sha1"
"encoding/binary"
"errors"
"fmt"
- "github.com/anacrolix/libtorgo/bencode"
"io"
"log"
"math/big"
"net"
"os"
"time"
+
+ "bitbucket.org/anacrolix/go.torrent/iplist"
+ "bitbucket.org/anacrolix/go.torrent/logonce"
+ "bitbucket.org/anacrolix/go.torrent/util"
+ "bitbucket.org/anacrolix/sync"
+ "github.com/anacrolix/libtorgo/bencode"
)
const maxNodes = 10000
t.onResponse = f
}
-func unmarshalNodeInfoBinary(b []byte) (ret []NodeInfo, err error) {
- if len(b)%26 != 0 {
- err = errors.New("bad buffer length")
- return
- }
- ret = make([]NodeInfo, 0, len(b)/26)
- for i := 0; i < len(b); i += 26 {
- var ni NodeInfo
- err = ni.UnmarshalCompact(b[i : i+26])
- if err != nil {
- return
- }
- ret = append(ret, ni)
- }
- return
-}
-
-func extractNodes(d Msg) (nodes []NodeInfo, err error) {
- if d["y"] != "r" {
- return
- }
- r, ok := d["r"]
- if !ok {
- err = errors.New("missing r dict")
- return
- }
- rd, ok := r.(map[string]interface{})
- if !ok {
- err = errors.New("bad r value type")
- return
- }
- n, ok := rd["nodes"]
- if !ok {
- return
- }
- ns, ok := n.(string)
- if !ok {
- err = errors.New("bad nodes value type")
- return
- }
- return unmarshalNodeInfoBinary([]byte(ns))
-}
-
func (s *Server) liftNodes(d Msg) {
if d["y"] != "r" {
return
return request{index, chunkSpec{begin, length}}
}
-type pieceByBytesPendingSlice struct {
- Pending, Indices []peer_protocol.Integer
-}
-
-func (pcs pieceByBytesPendingSlice) Len() int {
- return len(pcs.Indices)
-}
-
-func (me pieceByBytesPendingSlice) Less(i, j int) bool {
- return me.Pending[me.Indices[i]] < me.Pending[me.Indices[j]]
-}
-
-func (me pieceByBytesPendingSlice) Swap(i, j int) {
- me.Indices[i], me.Indices[j] = me.Indices[j], me.Indices[i]
-}
-
var (
// Requested data not yet available.
ErrDataNotReady = errors.New("data not ready")
import (
"container/heap"
- "container/list"
"fmt"
"io"
"log"
"sync"
"time"
- "bitbucket.org/anacrolix/go.torrent/util"
-
"bitbucket.org/anacrolix/go.torrent/mmap_span"
pp "bitbucket.org/anacrolix/go.torrent/peer_protocol"
"bitbucket.org/anacrolix/go.torrent/tracker"
+ "bitbucket.org/anacrolix/go.torrent/util"
"github.com/anacrolix/libtorgo/bencode"
"github.com/anacrolix/libtorgo/metainfo"
)
return
}
-type pieceBytesLeft struct {
- Piece, BytesLeft int
-}
-
-type torrentPiece struct {
- piece
- bytesLeftElement *list.Element
-}
-
type peersKey struct {
IPBytes string
Port int
ceasingNetworking chan struct{}
InfoHash InfoHash
- Pieces []*torrentPiece
+ Pieces []*piece
length int64
// Prevent mutations to Data memory maps while in use as they're not safe.
dataLock sync.RWMutex
}
t.length = t.Data.Size()
for _, hash := range infoPieceHashes(&md) {
- piece := &torrentPiece{}
+ piece := &piece{}
piece.Event.L = eventLocker
util.CopyExact(piece.Hash[:], hash)
t.Pieces = append(t.Pieces, piece)