From ada8dee0aa6a5d2b730ece3d20d447bf968bb90f Mon Sep 17 00:00:00 2001 From: Erik Brakkee Date: Thu, 18 Jul 2024 21:25:00 +0200 Subject: [PATCH] further generalizatio of synchronizing two streams of data. --- cmd/tcptows/tcptows.go | 23 +---------------------- cmd/wstotcp/wstotcp.go | 27 +-------------------------- pkg/iowrappers/sync.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 48 deletions(-) create mode 100644 pkg/iowrappers/sync.go diff --git a/cmd/tcptows/tcptows.go b/cmd/tcptows/tcptows.go index 3f36621..f30a797 100644 --- a/cmd/tcptows/tcptows.go +++ b/cmd/tcptows/tcptows.go @@ -3,7 +3,6 @@ package main import ( "cidebug/pkg/iowrappers" "github.com/gorilla/websocket" - "io" "log" "net" ) @@ -19,27 +18,7 @@ func handleConnection(tcpConn net.Conn, wsURL string) { } defer wsConn.Close() - waitChannel := make(chan bool) - - go func() { - defer func() { - waitChannel <- true - }() - _, err = io.Copy(tcpConn, wsConn) - if err != nil { - log.Printf("error %v", err) - } - }() - - go func() { - defer func() { - waitChannel <- true - }() - _, err = io.Copy(wsConn, tcpConn) - log.Printf("Error %v", err) - }() - - <-waitChannel + iowrappers.SynchronizeStreams(wsConn, tcpConn) } func main() { diff --git a/cmd/wstotcp/wstotcp.go b/cmd/wstotcp/wstotcp.go index a8e401d..7c81b79 100644 --- a/cmd/wstotcp/wstotcp.go +++ b/cmd/wstotcp/wstotcp.go @@ -4,7 +4,6 @@ import ( "cidebug/pkg/iowrappers" "fmt" "github.com/gorilla/websocket" - "io" "log" "net" "net/http" @@ -42,29 +41,5 @@ func handleWebSocket(w http.ResponseWriter, r *http.Request, tcpConn net.Conn) { } defer wsConn.Close() - waitChannel := make(chan bool) - - // Read message from WebSocket - go func() { - defer func() { - waitChannel <- true - }() - _, err := io.Copy(tcpConn, wsConn) - if err != nil { - log.Printf("Error occurred %v", err) - } - }() - - go func() { - defer func() { - waitChannel <- true - }() - _, err := io.Copy(wsConn, tcpConn) - if err != nil { - log.Printf("Error occurred %v", err) - } - }() - - <-waitChannel - log.Println("Connection closed") + iowrappers.SynchronizeStreams(tcpConn, wsConn) } diff --git a/pkg/iowrappers/sync.go b/pkg/iowrappers/sync.go new file mode 100644 index 0000000..20a7820 --- /dev/null +++ b/pkg/iowrappers/sync.go @@ -0,0 +1,31 @@ +package iowrappers + +import ( + "io" + "log" +) + +func SynchronizeStreams(stream1, stream2 io.ReadWriter) { + waitChannel := make(chan bool) + + go func() { + defer func() { + waitChannel <- true + }() + _, err := io.Copy(stream1, stream2) + if err != nil { + log.Printf("error %v", err) + } + }() + + go func() { + defer func() { + waitChannel <- true + }() + _, err := io.Copy(stream2, stream1) + log.Printf("Error %v", err) + }() + + <-waitChannel + log.Println("Connection closed") +}