status-go/vendor/github.com/koron/go-ssdp/udp.go

77 lines
1.6 KiB
Go

package ssdp
import (
"net"
"time"
)
var (
sendAddrIPv4 = "239.255.255.250:1900"
recvAddrIPv4 = "224.0.0.0:1900"
ssdpAddrIPv4 *net.UDPAddr
)
func init() {
// FIXME: https://github.com/koron/go-ssdp/issues/9
var err error
ssdpAddrIPv4, err = net.ResolveUDPAddr("udp4", sendAddrIPv4)
if err != nil {
panic(err)
}
}
type packetHandler func(net.Addr, []byte) error
func readPackets(conn *net.UDPConn, timeout time.Duration, h packetHandler) error {
buf := make([]byte, 65535)
conn.SetReadBuffer(len(buf))
conn.SetReadDeadline(time.Now().Add(timeout))
for {
n, addr, err := conn.ReadFrom(buf)
if err != nil {
if nerr, ok := err.(net.Error); ok && nerr.Timeout() {
return nil
}
return err
}
if err := h(addr, buf[:n]); err != nil {
return err
}
}
}
func sendTo(to *net.UDPAddr, data []byte) (int, error) {
conn, err := net.DialUDP("udp4", nil, to)
if err != nil {
return 0, err
}
defer conn.Close()
n, err := conn.Write(data)
if err != nil {
return 0, err
}
return n, nil
}
// SetMulticastSendAddrIPv4 updates a UDP address to send multicast packets.
func SetMulticastSendAddrIPv4(s string) error {
// FIXME: https://github.com/koron/go-ssdp/issues/9
addr, err := net.ResolveUDPAddr("udp4", s)
if err != nil {
return err
}
ssdpAddrIPv4 = addr
return nil
}
// SetMulticastRecvAddrIPv4 updates multicast address where to receive packets.
func SetMulticastRecvAddrIPv4(s string) error {
// FIXME: https://github.com/koron/go-ssdp/issues/9
_, err := net.ResolveUDPAddr("udp4", s)
if err != nil {
return err
}
recvAddrIPv4 = s
return nil
}