package main import ( "cidebug/pkg/iowrappers" "cidebug/pkg/websocketutil" "github.com/gorilla/websocket" "log" "net" "os" "time" ) func closeConnection(conn net.Conn) { if tcpConn, ok := conn.(*net.TCPConn); ok { tcpConn.SetLinger(0) } _ = conn.Close() } func handleConnection(conn net.Conn, wsURL string) { defer closeConnection(conn) log.Printf("Connecting to '%s'\n", wsURL) _wsConn, _, err := websocket.DefaultDialer.Dial(wsURL, nil) if err != nil { log.Println("WebSocket connection error:", err) return } _wsConn.SetReadDeadline(time.Time{}) _wsConn.SetWriteDeadline(time.Time{}) wsConn := websocketutil.NewWebSocketConn(_wsConn) defer wsConn.Close() iowrappers.SynchronizeStreams(wsConn, conn) } func main() { tcpPort := os.Args[1] wsURL := os.Args[2] listener, err := net.Listen("tcp", ":"+tcpPort) if err != nil { log.Fatal(err) } defer listener.Close() log.Printf("TCP server listening on port %s\n", tcpPort) log.Printf("Forwarding connections to WebSocket server at %s\n", wsURL) for { conn, err := listener.Accept() if err != nil { log.Println(err) continue } go handleConnection(conn, wsURL) } }