nodeinfo.go 829 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package krpc
  2. import (
  3. "bytes"
  4. "encoding"
  5. "encoding/binary"
  6. "fmt"
  7. "math"
  8. "math/rand"
  9. "net"
  10. )
  11. type NodeInfo struct {
  12. ID ID
  13. Addr NodeAddr
  14. }
  15. func (me NodeInfo) String() string {
  16. return fmt.Sprintf("{%x at %s}", me.ID, me.Addr)
  17. }
  18. func RandomNodeInfo(ipLen int) (ni NodeInfo) {
  19. rand.Read(ni.ID[:])
  20. ni.Addr.IP = make(net.IP, ipLen)
  21. rand.Read(ni.Addr.IP)
  22. ni.Addr.Port = rand.Intn(math.MaxUint16 + 1)
  23. return
  24. }
  25. var _ interface {
  26. encoding.BinaryMarshaler
  27. encoding.BinaryUnmarshaler
  28. } = (*NodeInfo)(nil)
  29. func (ni NodeInfo) MarshalBinary() ([]byte, error) {
  30. var w bytes.Buffer
  31. w.Write(ni.ID[:])
  32. w.Write(ni.Addr.IP)
  33. binary.Write(&w, binary.BigEndian, uint16(ni.Addr.Port))
  34. return w.Bytes(), nil
  35. }
  36. func (ni *NodeInfo) UnmarshalBinary(b []byte) error {
  37. copy(ni.ID[:], b)
  38. return ni.Addr.UnmarshalBinary(b[20:])
  39. }