Change -port to -listen with flexible address format
Supports host:port, host, or :port for binding to specific interfaces. Useful for running alongside other ArtNet software. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -20,12 +20,7 @@ type Receiver struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewReceiver creates a new ArtNet receiver
|
// NewReceiver creates a new ArtNet receiver
|
||||||
func NewReceiver(port int, handler PacketHandler) (*Receiver, error) {
|
func NewReceiver(addr *net.UDPAddr, handler PacketHandler) (*Receiver, error) {
|
||||||
addr := &net.UDPAddr{
|
|
||||||
Port: port,
|
|
||||||
IP: net.IPv4zero,
|
|
||||||
}
|
|
||||||
|
|
||||||
conn, err := net.ListenUDP("udp4", addr)
|
conn, err := net.ListenUDP("udp4", addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# artmap configuration
|
# artmap configuration
|
||||||
# Run with: go run . -config config.toml [-port 6454] [-broadcast 2.255.255.255]
|
# Run with: go run . -config config.toml [-listen :6454] [-broadcast 2.255.255.255]
|
||||||
|
|
||||||
# Address format:
|
# Address format:
|
||||||
# from: universe[:channels] - range specifies which channels to read
|
# from: universe[:channels] - range specifies which channels to read
|
||||||
|
|||||||
54
main.go
54
main.go
@@ -7,6 +7,8 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/gopatchy/artmap/artnet"
|
"github.com/gopatchy/artmap/artnet"
|
||||||
@@ -25,11 +27,17 @@ type App struct {
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
configPath := flag.String("config", "config.toml", "path to config file")
|
configPath := flag.String("config", "config.toml", "path to config file")
|
||||||
listenPort := flag.Int("port", artnet.Port, "ArtNet listen port")
|
listenAddr := flag.String("listen", ":6454", "listen address (host:port, host, or :port)")
|
||||||
broadcastAddr := flag.String("broadcast", "2.255.255.255", "ArtNet broadcast address")
|
broadcastAddr := flag.String("broadcast", "2.255.255.255", "ArtNet broadcast address")
|
||||||
debug := flag.Bool("debug", false, "log ArtNet packets")
|
debug := flag.Bool("debug", false, "log ArtNet packets")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
|
// Parse listen address
|
||||||
|
addr, err := parseListenAddr(*listenAddr)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("invalid listen address: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// Load config
|
// Load config
|
||||||
cfg, err := config.Load(*configPath)
|
cfg, err := config.Load(*configPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -70,7 +78,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create receiver
|
// Create receiver
|
||||||
receiver, err := artnet.NewReceiver(*listenPort, app)
|
receiver, err := artnet.NewReceiver(addr, app)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to create receiver: %v", err)
|
log.Fatalf("failed to create receiver: %v", err)
|
||||||
}
|
}
|
||||||
@@ -80,7 +88,7 @@ func main() {
|
|||||||
receiver.Start()
|
receiver.Start()
|
||||||
discovery.Start()
|
discovery.Start()
|
||||||
|
|
||||||
log.Printf("listening on port %d", *listenPort)
|
log.Printf("listening on %s", addr)
|
||||||
log.Printf("broadcasting to %s", *broadcastAddr)
|
log.Printf("broadcasting to %s", *broadcastAddr)
|
||||||
|
|
||||||
// Wait for interrupt
|
// Wait for interrupt
|
||||||
@@ -155,3 +163,43 @@ func init() {
|
|||||||
fmt.Println("artmap - ArtNet Remapping Proxy")
|
fmt.Println("artmap - ArtNet Remapping Proxy")
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseListenAddr parses listen address formats:
|
||||||
|
// - "host:port" -> bind to specific host and port
|
||||||
|
// - "host" -> bind to specific host, default port
|
||||||
|
// - ":port" -> bind to all interfaces, specific port
|
||||||
|
func parseListenAddr(s string) (*net.UDPAddr, error) {
|
||||||
|
var host string
|
||||||
|
var port int
|
||||||
|
|
||||||
|
if strings.Contains(s, ":") {
|
||||||
|
h, p, err := net.SplitHostPort(s)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
host = h
|
||||||
|
if p == "" {
|
||||||
|
port = artnet.Port
|
||||||
|
} else {
|
||||||
|
port, err = strconv.Atoi(p)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
host = s
|
||||||
|
port = artnet.Port
|
||||||
|
}
|
||||||
|
|
||||||
|
var ip net.IP
|
||||||
|
if host == "" {
|
||||||
|
ip = net.IPv4zero
|
||||||
|
} else {
|
||||||
|
ip = net.ParseIP(host)
|
||||||
|
if ip == nil {
|
||||||
|
return nil, fmt.Errorf("invalid IP address: %s", host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &net.UDPAddr{IP: ip, Port: port}, nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user