addr.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package dht
  2. import (
  3. "net"
  4. "github.com/anacrolix/missinggo/v2"
  5. "github.com/anacrolix/dht/v2/krpc"
  6. )
  7. // Used internally to refer to node network addresses. String() is called a
  8. // lot, and so can be optimized. Network() is not exposed, so that the
  9. // interface does not satisfy net.Addr, as the underlying type must be passed
  10. // to any OS-level function that take net.Addr.
  11. type Addr interface {
  12. Raw() net.Addr
  13. Port() int
  14. IP() net.IP
  15. String() string
  16. KRPC() krpc.NodeAddr
  17. }
  18. // Speeds up some of the commonly called Addr methods.
  19. type cachedAddr struct {
  20. raw net.Addr
  21. port int
  22. ip net.IP
  23. s string
  24. }
  25. func (ca cachedAddr) String() string {
  26. return ca.s
  27. }
  28. func (ca cachedAddr) KRPC() krpc.NodeAddr {
  29. return krpc.NodeAddr{
  30. IP: ca.ip,
  31. Port: ca.port,
  32. }
  33. }
  34. func (ca cachedAddr) IP() net.IP {
  35. return ca.ip
  36. }
  37. func (ca cachedAddr) Port() int {
  38. return ca.port
  39. }
  40. func (ca cachedAddr) Raw() net.Addr {
  41. return ca.raw
  42. }
  43. func NewAddr(raw net.Addr) Addr {
  44. return cachedAddr{
  45. raw: raw,
  46. s: raw.String(),
  47. ip: missinggo.AddrIP(raw),
  48. port: missinggo.AddrPort(raw),
  49. }
  50. }