mirror of
				https://github.com/xjasonlyu/tun2socks.git
				synced 2025-10-31 12:06:37 +08:00 
			
		
		
		
	add proxy utilities
This commit is contained in:
		
							
								
								
									
										54
									
								
								proxy/proxy.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								proxy/proxy.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| package proxy | ||||
|  | ||||
| import ( | ||||
| 	"io" | ||||
| 	"net" | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/xjasonlyu/tun2socks/common/pool" | ||||
| ) | ||||
|  | ||||
| func TCPRelay(localConn, remoteConn net.Conn) { | ||||
| 	var once sync.Once | ||||
| 	closeOnce := func() { | ||||
| 		once.Do(func() { | ||||
| 			localConn.Close() | ||||
| 			remoteConn.Close() | ||||
| 		}) | ||||
| 	} | ||||
|  | ||||
| 	// Close | ||||
| 	defer closeOnce() | ||||
|  | ||||
| 	// WaitGroup | ||||
| 	var wg sync.WaitGroup | ||||
| 	wg.Add(1) | ||||
|  | ||||
| 	// Up Link | ||||
| 	go func() { | ||||
| 		buf := pool.BufPool.Get().([]byte) | ||||
| 		defer pool.BufPool.Put(buf[:cap(buf)]) | ||||
| 		if _, err := io.CopyBuffer(remoteConn, localConn, buf); err != nil { | ||||
| 			closeOnce() | ||||
| 		} else { | ||||
| 			localConn.SetDeadline(time.Now()) | ||||
| 			remoteConn.SetDeadline(time.Now()) | ||||
| 			TCPCloseRead(remoteConn) | ||||
| 		} | ||||
| 		wg.Done() | ||||
| 	}() | ||||
|  | ||||
| 	// Down Link | ||||
| 	buf := pool.BufPool.Get().([]byte) | ||||
| 	if _, err := io.CopyBuffer(localConn, remoteConn, buf); err != nil { | ||||
| 		closeOnce() | ||||
| 	} else { | ||||
| 		localConn.SetDeadline(time.Now()) | ||||
| 		remoteConn.SetDeadline(time.Now()) | ||||
| 		TCPCloseRead(localConn) | ||||
| 	} | ||||
| 	pool.BufPool.Put(buf[:cap(buf)]) | ||||
|  | ||||
| 	wg.Wait() // Wait for Up Link done | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Jason
					Jason