Files
spectr/internal/discovery/server.go
T
2026-08-27 19:41:00 +03:00

43 lines
766 B
Go

package discovery
import (
"context"
"net"
"strings"
"time"
)
func Serve(ctx context.Context, port int, grpcAddr string) error {
conn, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4zero, Port: port})
if err != nil {
return err
}
defer conn.Close()
buf := make([]byte, 256)
for {
if err := conn.SetReadDeadline(time.Now().Add(time.Second)); err != nil {
return err
}
n, remote, err := conn.ReadFromUDP(buf)
if err != nil {
if ne, ok := err.(net.Error); ok && ne.Timeout() {
select {
case <-ctx.Done():
return nil
default:
continue
}
}
return err
}
if strings.TrimSpace(string(buf[:n])) != requestMagic {
continue
}
_, _ = conn.WriteToUDP([]byte(responsePrefix+grpcAddr), remote)
}
}