commit 07ddf7e87bf1393c096c23b2c2b363b1c990416e Author: Jakob Borg Date: Sun Dec 22 21:35:05 2013 -0500 External discover diff --git a/cmd/discosrv/main.go b/cmd/discosrv/main.go new file mode 100644 index 00000000..2941dd9c --- /dev/null +++ b/cmd/discosrv/main.go @@ -0,0 +1,74 @@ +package main + +import ( + "log" + "net" + "sync" + + "github.com/calmh/syncthing/discover" +) + +type Node struct { + IP []byte + Port uint16 +} + +var ( + nodes = make(map[string]Node) + lock sync.Mutex +) + +func main() { + addr, _ := net.ResolveUDPAddr("udp", ":22025") + conn, err := net.ListenUDP("udp", addr) + if err != nil { + panic(err) + } + + var buf = make([]byte, 1024) + for { + n, addr, err := conn.ReadFromUDP(buf) + if err != nil { + panic(err) + } + pkt, err := discover.DecodePacket(buf[:n]) + if err != nil { + log.Println("Warning:", err) + continue + } + + switch pkt.Magic { + case 0x20121025: + // Announcement + //lock.Lock() + ip := addr.IP.To4() + if ip == nil { + ip = addr.IP.To16() + } + node := Node{ip, uint16(pkt.Port)} + log.Println("<-", pkt.ID, node) + nodes[pkt.ID] = node + //lock.Unlock() + case 0x19760309: + // Query + //lock.Lock() + node, ok := nodes[pkt.ID] + //lock.Unlock() + if ok { + pkt := discover.Packet{ + Magic: 0x20121025, + ID: pkt.ID, + Port: node.Port, + IP: node.IP, + } + _, _, err = conn.WriteMsgUDP(discover.EncodePacket(pkt), nil, addr) + if err != nil { + log.Println("Warning:", err) + } else { + log.Println("->", pkt.ID, node) + } + } + } + + } +}