peer.go 969 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package httpTracker
  2. import (
  3. "fmt"
  4. "net"
  5. "net/netip"
  6. "github.com/anacrolix/dht/v2/krpc"
  7. )
  8. // TODO: Use netip.Addr and Option[[20]byte].
  9. type Peer struct {
  10. IP net.IP `bencode:"ip"`
  11. Port int `bencode:"port"`
  12. ID []byte `bencode:"peer id"`
  13. }
  14. func (p Peer) ToNetipAddrPort() (addrPort netip.AddrPort, ok bool) {
  15. addr, ok := netip.AddrFromSlice(p.IP)
  16. addrPort = netip.AddrPortFrom(addr, uint16(p.Port))
  17. return
  18. }
  19. func (p Peer) String() string {
  20. loc := net.JoinHostPort(p.IP.String(), fmt.Sprintf("%d", p.Port))
  21. if len(p.ID) != 0 {
  22. return fmt.Sprintf("%x at %s", p.ID, loc)
  23. } else {
  24. return loc
  25. }
  26. }
  27. // Set from the non-compact form in BEP 3.
  28. func (p *Peer) FromDictInterface(d map[string]interface{}) {
  29. p.IP = net.ParseIP(d["ip"].(string))
  30. if _, ok := d["peer id"]; ok {
  31. p.ID = []byte(d["peer id"].(string))
  32. }
  33. p.Port = int(d["port"].(int64))
  34. }
  35. func (p Peer) FromNodeAddr(na krpc.NodeAddr) Peer {
  36. p.IP = na.IP
  37. p.Port = na.Port
  38. return p
  39. }