main.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "log"
  4. "net"
  5. "sync"
  6. "github.com/calmh/syncthing/discover"
  7. )
  8. type Node struct {
  9. IP []byte
  10. Port uint16
  11. }
  12. var (
  13. nodes = make(map[string]Node)
  14. lock sync.Mutex
  15. )
  16. func main() {
  17. addr, _ := net.ResolveUDPAddr("udp", ":22025")
  18. conn, err := net.ListenUDP("udp", addr)
  19. if err != nil {
  20. panic(err)
  21. }
  22. var buf = make([]byte, 1024)
  23. for {
  24. n, addr, err := conn.ReadFromUDP(buf)
  25. if err != nil {
  26. panic(err)
  27. }
  28. pkt, err := discover.DecodePacket(buf[:n])
  29. if err != nil {
  30. log.Println("Warning:", err)
  31. continue
  32. }
  33. switch pkt.Magic {
  34. case 0x20121025:
  35. // Announcement
  36. //lock.Lock()
  37. ip := addr.IP.To4()
  38. if ip == nil {
  39. ip = addr.IP.To16()
  40. }
  41. node := Node{ip, uint16(pkt.Port)}
  42. log.Println("<-", pkt.ID, node)
  43. nodes[pkt.ID] = node
  44. //lock.Unlock()
  45. case 0x19760309:
  46. // Query
  47. //lock.Lock()
  48. node, ok := nodes[pkt.ID]
  49. //lock.Unlock()
  50. if ok {
  51. pkt := discover.Packet{
  52. Magic: 0x20121025,
  53. ID: pkt.ID,
  54. Port: node.Port,
  55. IP: node.IP,
  56. }
  57. _, _, err = conn.WriteMsgUDP(discover.EncodePacket(pkt), nil, addr)
  58. if err != nil {
  59. log.Println("Warning:", err)
  60. } else {
  61. log.Println("->", pkt.ID, node)
  62. }
  63. }
  64. }
  65. }
  66. }