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.

Reply via email to