8 "github.com/anacrolix/dht/v2/krpc"
9 "github.com/anacrolix/missinggo/v2"
12 type NewConnClientOpts struct {
18 type ConnClient struct {
26 func (cc *ConnClient) reader() {
28 b := make([]byte, 0x800)
29 n, err := cc.conn.Read(b)
31 // TODO: Do bad things to the dispatcher, and incoming calls to the client if we have a
36 err = cc.d.Dispatch(b[:n])
38 log.Printf("dispatching packet received on %v: %v", cc.conn, err)
43 func ipv6(opt *bool, network string, conn net.Conn) bool {
53 rip := missinggo.AddrIP(conn.RemoteAddr())
54 return rip.To16() != nil && rip.To4() == nil
57 func NewConnClient(opts NewConnClientOpts) (cc *ConnClient, err error) {
58 conn, err := net.Dial(opts.Network, opts.Host)
67 ipv6: ipv6(opts.Ipv6, opts.Network, conn),
69 cc.cl.Dispatcher = &cc.d
74 func (c *ConnClient) Close() error {
78 func (c *ConnClient) Announce(
79 ctx context.Context, req AnnounceRequest, opts Options,
81 h AnnounceResponseHeader, nas AnnounceResponsePeers, err error,
83 nas = func() AnnounceResponsePeers {
85 return &krpc.CompactIPv6NodeAddrs{}
87 return &krpc.CompactIPv4NodeAddrs{}
90 h, err = c.cl.Announce(ctx, req, nas, opts)