udpManifold.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "net"
  6. "strconv"
  7. "strings"
  8. log "github.com/sirupsen/logrus"
  9. )
  10. func startManifold(listenSocket *net.UDPConn, sendSockets []*net.UDPConn) error {
  11. var buffer [10000]byte
  12. for {
  13. length, _, err := listenSocket.ReadFromUDP(buffer[:])
  14. if err != nil {
  15. return err
  16. }
  17. for _, conn := range sendSockets {
  18. go conn.Write(buffer[:length])
  19. }
  20. }
  21. }
  22. func openReceiveSocket(listenPort int, multicastGroup string) (*net.UDPConn, error) {
  23. var err error
  24. var listenSocket *net.UDPConn
  25. var resolvedMulticastGroup *net.IPAddr
  26. if len(multicastGroup) > 0 {
  27. resolvedMulticastGroup, err = net.ResolveIPAddr("ip4", multicastGroup)
  28. if err != nil {
  29. return nil, err
  30. }
  31. listenSocket, err = net.ListenMulticastUDP("udp4", nil, &net.UDPAddr{
  32. IP: resolvedMulticastGroup.IP, Zone: resolvedMulticastGroup.Zone, Port: listenPort})
  33. } else {
  34. listenSocket, err = net.ListenUDP("udp4", &net.UDPAddr{
  35. IP: resolvedMulticastGroup.IP, Zone: resolvedMulticastGroup.Zone, Port: listenPort})
  36. }
  37. if err != nil {
  38. return nil, err
  39. }
  40. return listenSocket, nil
  41. }
  42. func printError(err error) {
  43. log.WithFields(log.Fields{
  44. "error": err.Error(),
  45. }).Error("Unhandled error")
  46. }
  47. func createSendConnections(sendAddressString string) ([]*net.UDPConn, error) {
  48. var connections []*net.UDPConn
  49. for _, rawString := range strings.Split(sendAddressString, ",") {
  50. parts := strings.Split(rawString, ":")
  51. if len(parts) != 2 {
  52. return nil, fmt.Errorf("%[1]s is an invalid address", rawString)
  53. }
  54. ip, err := net.ResolveIPAddr("ip4", parts[0])
  55. if err != nil {
  56. return nil, err
  57. }
  58. port, err := strconv.Atoi(parts[1])
  59. if err != nil {
  60. return nil, err
  61. }
  62. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{IP: ip.IP, Port: port})
  63. if err != nil {
  64. return nil, err
  65. }
  66. connections = append(connections, conn)
  67. }
  68. return connections, nil
  69. }
  70. func main() {
  71. listenPort := flag.Int("listenPort", 4000, "Udp port to listen on")
  72. multicastAddress := flag.String("multicastGroup", "230.0.0.1", "Optional mutlicast group to subscribe to")
  73. sendAddresses := flag.String("sendAddresses", "localhost:4001", "Udp addresses to send out on (comma separated")
  74. flag.Parse()
  75. receiveSocket, err := openReceiveSocket(*listenPort, *multicastAddress)
  76. if err != nil {
  77. printError(err)
  78. return
  79. }
  80. sendSockets, err := createSendConnections(*sendAddresses)
  81. if err != nil {
  82. printError(err)
  83. return
  84. }
  85. err = startManifold(receiveSocket, sendSockets)
  86. if err != nil {
  87. printError(err)
  88. return
  89. }
  90. }