"github.com/anacrolix/missinggo/pubsub"
"github.com/anacrolix/missinggo/slices"
"github.com/anacrolix/sync"
- "github.com/anacrolix/utp"
"github.com/dustin/go-humanize"
"golang.org/x/time/rate"
defaultStorage *storage.Client
onClose []func()
tcpListener net.Listener
- utpSock *utp.Socket
+ utpSock utpSocket
dHT *dht.Server
ipBlockList iplist.Ranger
// Our BitTorrent protocol extension bytes, sent in our BT handshakes.
}
}
-func listenUTP(networkSuffix, addr string) (*utp.Socket, error) {
- return utp.NewSocket("udp"+networkSuffix, addr)
+func listenUTP(networkSuffix, addr string) (utpSocket, error) {
+ return NewUtpSocket("udp"+networkSuffix, addr)
}
func listenTCP(networkSuffix, addr string) (net.Listener, error) {
return net.Listen("tcp"+networkSuffix, addr)
}
-func listenBothSameDynamicPort(networkSuffix, host string) (tcpL net.Listener, utpSock *utp.Socket, listenedAddr string, err error) {
+func listenBothSameDynamicPort(networkSuffix, host string) (tcpL net.Listener, utpSock utpSocket, listenedAddr string, err error) {
for {
tcpL, err = listenTCP(networkSuffix, net.JoinHostPort(host, "0"))
if err != nil {
}
// Listen to enabled protocols, ensuring ports match.
-func listen(tcp, utp bool, networkSuffix, addr string) (tcpL net.Listener, utpSock *utp.Socket, listenedAddr string, err error) {
+func listen(tcp, utp bool, networkSuffix, addr string) (tcpL net.Listener, utpSock utpSocket, listenedAddr string, err error) {
if addr == "" {
addr = ":50007"
}
cl.dHT.Close()
}
if cl.utpSock != nil {
- cl.utpSock.CloseNow()
+ cl.utpSock.Close()
}
if cl.tcpListener != nil {
cl.tcpListener.Close()
"github.com/anacrolix/missinggo"
"github.com/anacrolix/missinggo/filecache"
"github.com/anacrolix/missinggo/pubsub"
- "github.com/anacrolix/utp"
"github.com/bradfitz/iter"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
}
func TestUTPRawConn(t *testing.T) {
- l, err := utp.NewSocket("udp", "")
+ l, err := NewUtpSocket("udp", "")
if err != nil {
t.Fatal(err)
}
}
}()
// Connect a UTP peer to see if the RawConn will still work.
- s, _ := utp.NewSocket("udp", "")
+ s, _ := NewUtpSocket("udp", "")
defer s.Close()
utpPeer, err := s.Dial(fmt.Sprintf("localhost:%d", missinggo.AddrPort(l.Addr())))
if err != nil {
--- /dev/null
+package torrent
+
+import (
+ "net"
+ "time"
+)
+
+// Abstracts the utp Socket, so the implementation can be selected from
+// different packages.
+type utpSocket interface {
+ Accept() (net.Conn, error)
+ Addr() net.Addr
+ Close() error
+ LocalAddr() net.Addr
+ ReadFrom([]byte) (int, net.Addr, error)
+ SetDeadline(time.Time) error
+ SetWriteDeadline(time.Time) error
+ SetReadDeadline(time.Time) error
+ WriteTo([]byte, net.Addr) (int, error)
+ DialTimeout(string, time.Duration) (net.Conn, error)
+ Dial(string) (net.Conn, error)
+}
--- /dev/null
+// +build !cgo
+
+package torrent
+
+import (
+ "github.com/anacrolix/utp"
+)
+
+func NewUtpSocket(network, addr string) (utpSocket, error) {
+ return utp.NewSocket(network, addr)
+}
--- /dev/null
+// +build cgo
+
+package torrent
+
+import (
+ "github.com/anacrolix/go-libutp"
+)
+
+func NewUtpSocket(network, addr string) (utpSocket, error) {
+ return utp.NewSocket(network, addr)
+}