123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- 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)
- }
- }
- }
- }
- }
|