Browse Source

Initial commit

Spencer Gardner 6 years ago
commit
30681a5751
1 changed files with 101 additions and 0 deletions
  1. 101 0
      udpManifold.go

+ 101 - 0
udpManifold.go

@@ -0,0 +1,101 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+	"net"
+	"strconv"
+	"strings"
+
+	log "github.com/sirupsen/logrus"
+)
+
+func startManifold(listenSocket *net.UDPConn, sendSockets []*net.UDPConn) error {
+	var buffer [10000]byte
+	for {
+		length, _, err := listenSocket.ReadFromUDP(buffer[:])
+		if err != nil {
+			return err
+		}
+		for _, conn := range sendSockets {
+			go conn.Write(buffer[:length])
+		}
+	}
+}
+
+func openReceiveSocket(listenPort int, multicastGroup string) (*net.UDPConn, error) {
+	var err error
+	var listenSocket *net.UDPConn
+	var resolvedMulticastGroup *net.IPAddr
+	if len(multicastGroup) > 0 {
+		resolvedMulticastGroup, err = net.ResolveIPAddr("ip4", multicastGroup)
+		if err != nil {
+			return nil, err
+		}
+		listenSocket, err = net.ListenMulticastUDP("udp4", nil, &net.UDPAddr{
+			IP: resolvedMulticastGroup.IP, Zone: resolvedMulticastGroup.Zone, Port: listenPort})
+	} else {
+		listenSocket, err = net.ListenUDP("udp4", &net.UDPAddr{
+			IP: resolvedMulticastGroup.IP, Zone: resolvedMulticastGroup.Zone, Port: listenPort})
+	}
+	if err != nil {
+		return nil, err
+	}
+	return listenSocket, nil
+}
+
+func printError(err error) {
+	log.WithFields(log.Fields{
+		"error": err.Error(),
+	}).Error("Unhandled error")
+}
+
+func createSendConnections(sendAddressString string) ([]*net.UDPConn, error) {
+	var connections []*net.UDPConn
+
+	for _, rawString := range strings.Split(sendAddressString, ",") {
+		parts := strings.Split(rawString, ":")
+		if len(parts) != 2 {
+			return nil, fmt.Errorf("%[1]s is an invalid address", rawString)
+		}
+		ip, err := net.ResolveIPAddr("ip4", parts[0])
+		if err != nil {
+			return nil, err
+		}
+		port, err := strconv.Atoi(parts[1])
+		if err != nil {
+			return nil, err
+		}
+		conn, err := net.DialUDP("udp", nil, &net.UDPAddr{IP: ip.IP, Port: port})
+		if err != nil {
+			return nil, err
+		}
+		connections = append(connections, conn)
+	}
+
+	return connections, nil
+}
+
+func main() {
+
+	listenPort := flag.Int("listenPort", 4000, "Udp port to listen on")
+	multicastAddress := flag.String("multicastGroup", "230.0.0.1", "Optional mutlicast group to subscribe to")
+	sendAddresses := flag.String("sendAddresses", "localhost:4001", "Udp addresses to send out on (comma separated")
+
+	flag.Parse()
+	receiveSocket, err := openReceiveSocket(*listenPort, *multicastAddress)
+	if err != nil {
+		printError(err)
+		return
+	}
+	sendSockets, err := createSendConnections(*sendAddresses)
+	if err != nil {
+		printError(err)
+		return
+	}
+	err = startManifold(receiveSocket, sendSockets)
+	if err != nil {
+		printError(err)
+		return
+	}
+}