| 185 | } |
| 186 | |
| 187 | func (p *SocketConn) fullduplex() { |
| 188 | //bidirectional copy |
| 189 | log.Printf("Opened %s >>> %s", p.lconn.LocalAddr(), p.rconn.RemoteAddr()) |
| 190 | go p.pipe(p.lconn, p.rconn) |
| 191 | go p.pipe(p.rconn, p.lconn) |
| 192 | if p.Timeout > 0 { |
| 193 | p.lconn.SetDeadline(time.Now().Add(p.Timeout)) //nolint |
| 194 | p.rconn.SetDeadline(time.Now().Add(p.Timeout)) //nolint |
| 195 | } |
| 196 | |
| 197 | //wait for close... |
| 198 | <-p.errsig |
| 199 | log.Printf("Closed (%d bytes sent, %d bytes received)", p.sentBytes, p.receivedBytes) |
| 200 | } |
| 201 | |
| 202 | func (p *SocketConn) pipe(src, dst io.ReadWriter) { |
| 203 | islocal := src == p.lconn |