7 "github.com/anacrolix/dht/v2/krpc"
8 "github.com/anacrolix/missinggo/v2"
11 type NewConnClientOpts struct {
17 type ConnClient struct {
25 func (cc *ConnClient) reader() {
27 b := make([]byte, 0x800)
28 n, err := cc.conn.Read(b)
30 // TODO: Do bad things to the dispatcher, and incoming calls to the client if we have a
35 err = cc.d.Dispatch(b[:n])
37 //log.Printf("dispatching packet received on %v (%q): %v", cc.conn, string(b[:n]), err)
42 func ipv6(opt *bool, network string, conn net.Conn) bool {
52 rip := missinggo.AddrIP(conn.RemoteAddr())
53 return rip.To16() != nil && rip.To4() == nil
56 func NewConnClient(opts NewConnClientOpts) (cc *ConnClient, err error) {
57 conn, err := net.Dial(opts.Network, opts.Host)
66 ipv6: ipv6(opts.Ipv6, opts.Network, conn),
68 cc.cl.Dispatcher = &cc.d
73 func (c *ConnClient) Close() error {
77 func (c *ConnClient) Announce(
78 ctx context.Context, req AnnounceRequest, opts Options,
80 h AnnounceResponseHeader, nas AnnounceResponsePeers, err error,
82 nas = func() AnnounceResponsePeers {
84 return &krpc.CompactIPv6NodeAddrs{}
86 return &krpc.CompactIPv4NodeAddrs{}
89 h, err = c.cl.Announce(ctx, req, nas, opts)