package multicast

import (
	
	
)

type PacketHandler func(net.Addr, []byte) error

type AddrResolver struct {
	Addr string

	mu  sync.Mutex
	udp *net.UDPAddr
	err error
}

func ( *AddrResolver) ( string) {
	.mu.Lock()
	.Addr = 
	.udp = nil
	.err = nil
	.mu.Unlock()
}

func ( *AddrResolver) () (*net.UDPAddr, error) {
	.mu.Lock()
	defer .mu.Unlock()

	if  := .err;  != nil {
		return nil, 
	}
	if  := .udp;  != nil {
		return , nil
	}

	.udp, .err = net.ResolveUDPAddr("udp4", .Addr)
	return .udp, .err
}

var RecvAddrResolver = &AddrResolver{Addr: "224.0.0.1:1900"}

// SetRecvAddrIPv4 updates multicast address where to receive packets.
// This never fail now.
func ( string) error {
	RecvAddrResolver.setAddress()
	return nil
}

var sendAddrResolver = &AddrResolver{Addr: "239.255.255.250:1900"}

// SendAddr returns an address to send multicast UDP package.
func () (*net.UDPAddr, error) {
	return sendAddrResolver.resolve()
}

// SetSendAddrIPv4 updates a UDP address to send multicast packets.
// This never fail now.
func ( string) error {
	sendAddrResolver.setAddress()
	return nil
}