Looks like a TCP proxy or forwarder to me. For full duplex communicating you need two go routines per connection/session. And yes, needs something like a wait group for synchronization in order to handle half- closed connections properly, for client and server variants.
On Sunday, August 21, 2022 at 2:15:21 PM UTC+2 Brian Candler wrote: > "conn" is just a value, you can pass it around. However, if you're > sharing it between multiple goroutines you need to be careful, i.e. you > need to synchronize properly. The synchronization solutions are very > specific to your application: e.g. you could wait for that goroutine to > finish with a sync.WaitGroup, or the goroutine could send you a message on > a channel when it's done. > > I don't know why you want to use multiple goroutines on the *same* > connection though. (If you have multiple clients, they will open their own > TCP connections, which will be different "conn" objects). > > What you're now describing sounds very unlike "multiplexing", which I > would normally understand to be sending multiple independent sessions down > a single connection. > > On Sunday, 21 August 2022 at 12:32:27 UTC+1 ramki...@hotmail.com wrote: > >> My original issue is when using splice with io.Copy (example below), for >> me to regain access to conn, In a different go routine, I use >> remote.Close() which ends the one of io.Copy commands but, the second >> io.Copy ends when conn sends a new packet. The error use of closed network >> connection ends the io.Copy and every new packet conn sends, I can get with >> conn.Read() but the previous one is lost. >> I thought may be a multiplexer may help if I hope multiple streams for >> conn, I can end the splice while still reading all data with conn.Read() >> with a different stream. >> >> io.Copy(conn, remote) >> go io.Copy(remote, conn) >> >> >> >> On Sunday, August 21, 2022 at 5:17:37 AM UTC-4 harald....@gmx.net wrote: >> >>> do you even need a multiplexer? The common patten is to run Accept in a >>> loop that simply starts a new Go routine for every new accepted connection. >>> You only need a multiplexer of your application protocol needs multiplexing >>> inside an established TCP connection, either because there are multiple >>> destinations or multiple streams inside a single connection. >>> >>> >>> On Saturday, August 20, 2022 at 10:31:34 PM UTC+2 ramki...@hotmail.com >>> wrote: >>> >>>> Has anyone ever used a multiplexer <https://github.com/hashicorp/yamux>? >>>> When creating a TCP server using multiplexer, I get an error [ERR] yamux: >>>> Invalid protocol version: 102 when using Telnet to connect to the server. >>>> >>>> package main >>>> >>>> import ( >>>> "fmt" >>>> "net" >>>> >>>> "github.com/hashicorp/yamux" >>>> ) >>>> >>>> func main() { >>>> server() >>>> } >>>> >>>> func server() { >>>> >>>> listener, _ := net.Listen("tcp", "0.0.0.0:1113") >>>> for { >>>> >>>> // Accept a TCP connection >>>> conn, err := listener.Accept() >>>> if err != nil { >>>> panic(err) >>>> } >>>> >>>> // Setup server side of smux >>>> session, err := yamux.Server(conn, nil) >>>> if err != nil { >>>> panic(err) >>>> } >>>> >>>> // Accept a stream >>>> stream, err := session.Accept() >>>> if err != nil { >>>> panic(err) >>>> } >>>> fmt.Println("DPOO") >>>> >>>> // Listen for a message >>>> buf := make([]byte, 4) >>>> stream.Read(buf) >>>> stream.Close() >>>> session.Close() >>>> } >>>> } >>>> >>>> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/cef8cf40-fdfe-43ba-8a0a-5aefd6f16689n%40googlegroups.com.