Better (in theory) udp support

This commit is contained in:
Caleb Gardner
2021-09-23 15:08:31 -05:00
parent e2171e2c03
commit 4596c0315a
+48 -8
View File
@@ -17,6 +17,14 @@ type link struct {
linkType string linkType string
} }
func (l link) isTCP() bool {
return strings.HasPrefix(l.linkType, "tcp") || strings.HasPrefix(l.linkType, "unix")
}
func (l link) isUDP() bool {
return strings.HasPrefix(l.linkType, "udp")
}
func linker() { func linker() {
links, err := parseConf() links, err := parseConf()
if err != nil { if err != nil {
@@ -63,15 +71,34 @@ failWaiting:
func createLink(port int, l link, failChan chan int) { func createLink(port int, l link, failChan chan int) {
log.Println("Linking", port, "to", l.addr, "with type", l.linkType) log.Println("Linking", port, "to", l.addr, "with type", l.linkType)
listen, err := net.Listen(l.linkType, ":"+strconv.Itoa(port)) var tcpListen net.Listener
if err != nil { var con net.Conn
log.Println("Error while trying to listen to port ", port, ":", err) var err error
failChan <- port if l.isTCP() {
return tcpListen, err = net.Listen(l.linkType, ":"+strconv.Itoa(port))
if err != nil {
log.Println("Error while trying to listen to port", port, ":", err)
failChan <- port
return
}
defer tcpListen.Close()
} else if l.isUDP() {
var addr *net.UDPAddr
addr, err = net.ResolveUDPAddr(l.linkType, ":"+strconv.Itoa(port))
if err != nil {
log.Println("Error while parsing port", port, ":", err)
failChan <- port
return
}
con, err = net.ListenUDP(l.linkType, addr)
if err != nil {
log.Println("Error while listening to port", port, ":", err)
}
} }
defer listen.Close()
for { for {
con, err := listen.Accept() if l.isTCP() {
con, err = tcpListen.Accept()
}
if err != nil { if err != nil {
log.Println("Error while trying to accept connection to port ", port, ":", err) log.Println("Error while trying to accept connection to port ", port, ":", err)
failChan <- port failChan <- port
@@ -83,6 +110,19 @@ func createLink(port int, l link, failChan chan int) {
failChan <- port failChan <- port
return return
} }
if l.isUDP() {
var addr *net.UDPAddr
addr, err = net.ResolveUDPAddr(l.linkType, ":"+strconv.Itoa(port))
if err != nil {
log.Println("Error while parsing port", port, ":", err)
failChan <- port
return
}
con, err = net.ListenUDP(l.linkType, addr)
if err != nil {
log.Println("Error while listening to port", port, ":", err)
}
}
} }
} }
@@ -165,7 +205,7 @@ func parseConf() (links map[int]link, err error) {
func copyConn(src net.Conn, l link) error { func copyConn(src net.Conn, l link) error {
dst, err := net.Dial(l.linkType, l.addr) dst, err := net.Dial(l.linkType, l.addr)
if err != nil { if err != nil {
log.Println("Erro while dialing", l.addr) log.Println("Error while dialing", l.addr)
return err return err
} }