Skip to content

Instantly share code, notes, and snippets.

@maggie44
Created April 8, 2023 19:34
Show Gist options
  • Save maggie44/9658d7c2c62f289d44fc1cfcc384279b to your computer and use it in GitHub Desktop.
Save maggie44/9658d7c2c62f289d44fc1cfcc384279b to your computer and use it in GitHub Desktop.
Golang UDP to UDP relay
package udp_relay
import (
"net"
log "github.com/sirupsen/logrus"
)
var (
// Max buffer size for the socket io
Buffer = 10240
)
// UDPRelay is a function that relays data from a UDP socket to another UDP socket
// TODO: Add timeouts on connections
func UDPRelay(source string, target string) {
sourceAddr, err := net.ResolveUDPAddr("udp", source)
if err != nil {
log.WithError(err).Fatal("Could not resolve source address:", source)
return
}
targetAddr, err := net.ResolveUDPAddr("udp", target)
if err != nil {
log.WithError(err).Fatal("Could not resolve target address:", target)
return
}
sourceConn, err := net.ListenUDP("udp", sourceAddr)
if err != nil {
log.WithError(err).Fatal("Could not listen on address:", source)
return
}
defer sourceConn.Close()
conn, err := net.DialUDP("udp", nil, targetAddr)
if err != nil {
log.WithError(err).Fatal("Could not connect to target address:", target)
return
}
defer conn.Close()
log.Printf("Starting... Source at %v, Target at %v...", source, target)
for {
b := make([]byte, Buffer)
n, addr, err := sourceConn.ReadFromUDP(b)
if err != nil {
log.WithError(err).Error("Could not receive a packet")
continue
}
log.Debugf("Packet received: addr=%s bytes=%v", addr.String(), n)
if _, err := conn.Write(b[0:n]); err != nil {
log.WithError(err).Warn("Could not forward packet.")
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment