Add golang/tcpproxy.go
This commit is contained in:
60
golang/tcpproxy.go
Normal file
60
golang/tcpproxy.go
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
// Example usage:
|
||||||
|
// Terminal 1: python -m http.server 8000
|
||||||
|
// Terminal 2: go run tcpproxy.go 9000 localhost:8000
|
||||||
|
// Terminal 3: curl localhost:9000
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if len(os.Args) != 3 {
|
||||||
|
fmt.Println("Usage: go run tcpproxy.go <listen_port> <target_host:port>")
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
listenPort := os.Args[1] // port to listen on
|
||||||
|
targetAddr := os.Args[2] // target server address
|
||||||
|
|
||||||
|
// create TCP listener on specified port
|
||||||
|
listener, err := net.Listen("tcp", ":"+listenPort)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Failed to listen on port %s: %v\n", listenPort, err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
defer listener.Close()
|
||||||
|
|
||||||
|
fmt.Printf("TCP proxy listening on port %s, forwarding to %s\n", listenPort, targetAddr)
|
||||||
|
|
||||||
|
// accept incoming connections
|
||||||
|
for {
|
||||||
|
clientConn, err := listener.Accept()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Failed to accept connection: %v\n", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle each client connection concurrently
|
||||||
|
go handleConnection(clientConn, targetAddr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleConnection(clientConn net.Conn, targetAddr string) {
|
||||||
|
defer clientConn.Close() // ensure client connection is closed
|
||||||
|
|
||||||
|
// connect to target server
|
||||||
|
serverConn, err := net.Dial("tcp", targetAddr)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Failed to connect to target %s: %v\n", targetAddr, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer serverConn.Close() // ensure server connection is closed
|
||||||
|
|
||||||
|
// start bidirectional data copying
|
||||||
|
go io.Copy(serverConn, clientConn) // client -> server
|
||||||
|
io.Copy(clientConn, serverConn) // server -> client (blocks until done)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user