func InverterFinder(c *net.UDPConn, address *net.UDPAddr) { log.Println("findInverters:sending wakeup message") for { _, _, err := c.WriteMsgUDP(protocol.Wakeup(), nil, address) checkError(err) time.Sleep(120 * time.Second) } }
func handleQueryV2(conn *net.UDPConn, addr *net.UDPAddr, buf []byte) { var pkt discover.Query err := pkt.UnmarshalXDR(buf) if err != nil { log.Println("QueryV2 Unmarshal:", err) log.Println(hex.Dump(buf)) return } if debug { log.Printf("<- %v %#v", addr, pkt) } var id protocol.NodeID if len(pkt.NodeID) == 32 { // Raw node ID copy(id[:], pkt.NodeID) } else { id.UnmarshalText(pkt.NodeID) } lock.Lock() node, ok := nodes[id] queries++ lock.Unlock() if ok && len(node.addresses) > 0 { ann := discover.Announce{ Magic: discover.AnnouncementMagic, This: discover.Node{ ID: pkt.NodeID, }, } for _, addr := range node.addresses { ann.This.Addresses = append(ann.This.Addresses, discover.Address{IP: addr.ip, Port: addr.port}) } if debug { log.Printf("-> %v %#v", addr, pkt) } tb := ann.MarshalXDR() _, _, err = conn.WriteMsgUDP(tb, nil, addr) if err != nil { log.Println("QueryV2 response write:", err) } lock.Lock() answered++ lock.Unlock() } }
func handleQueryV2(conn *net.UDPConn, addr *net.UDPAddr, buf []byte) { var pkt discover.QueryV2 err := pkt.UnmarshalXDR(buf) if err != nil { log.Println("QueryV2 Unmarshal:", err) log.Println(hex.Dump(buf)) return } if debug { log.Printf("<- %v %#v", addr, pkt) } lock.Lock() node, ok := nodes[pkt.NodeID] queries++ lock.Unlock() if ok && len(node.Addresses) > 0 { pkt := discover.AnnounceV2{ Magic: discover.AnnouncementMagicV2, NodeID: pkt.NodeID, } for _, addr := range node.Addresses { pkt.Addresses = append(pkt.Addresses, discover.Address{IP: addr.IP, Port: addr.Port}) } if debug { log.Printf("-> %v %#v", addr, pkt) } tb := pkt.MarshalXDR() _, _, err = conn.WriteMsgUDP(tb, nil, addr) if err != nil { log.Println("QueryV2 response write:", err) } lock.Lock() answered++ lock.Unlock() } }
// writeToSessionUDP acts just like net.UDPConn.WritetTo(), but uses a *sessionUDP instead of a net.Addr. func writeToSessionUDP(conn *net.UDPConn, b []byte, session *sessionUDP) (int, error) { n, _, err := conn.WriteMsgUDP(b, session.context, session.raddr) return n, err }
func SendLogin(c *net.UDPConn, address *net.UDPAddr) { _, _, err := c.WriteMsgUDP(protocol.GetLoginPacket(), nil, address) checkError(err) }